在Ruby中,==和===有什么区别?该RDoc的说
大小写相等-对于类Object,实际上与调用#==相同,但通常被后代覆盖以在case语句中提供有意义的语义。
是#==
一样的==
吗?您能否提供一个在case语句中何时/如何使用它的示例?
Answers:
两者之间确实没有任何关系。特别#==
是,等于运算符,#===
与相等绝对无关。就我个人而言,我觉得很不幸,它#===
看起来与#==
,使用等号并在与等式无关的情况下通常称为大小写相等运算符,三等号运算符或threequals运算符。
我打电话#===
的情况下,包容操作(这是我能想出的最好,我很开放的建议,特别是从以英语为母语)。
最好的描述方式a === b
是“如果我有一个标有抽屉的抽屉a
,放入抽屉是否有意义b
?”
因此,例如,Module#===
测试是否b.is_a?(a)
。如果有的话Integer === 2
,2
在贴有标签的盒子里有意义Integer
吗?是的,它确实。那Integer === 'hello'
呢 显然不是。
另一个例子是Regexp#===
。它测试是否匹配。放入'hello'
标有标签的盒子有意义/el+/
吗?是的,它确实。
对于范围等集合,Range#===
定义为成员资格测试:将元素放入标有集合的框中是有意义的(如果该元素在集合中)。
就是#===
这样:它测试参数是否可以包含在接收方之下。
这是什么必须与case
表情?简单:
case foo
when bar
baz
end
是相同的
if bar === foo
baz
end
Array#===
未定义为ruby 1.8或1.9.1的成员资格。Range#===
是的。
是的,#==
文档中的意思是“==
当前对象的实例方法”。
===
用于case语句,例如:
case obj
when x
foo
when y
bar
end
是相同的
if x === obj
foo
elsif y === obj
bar
end
定义自己的一些类===
是Range(作用类似于include?
),Class(作用类似于obj.is_a?(klass)
)和Regexp
(=~
除了返回布尔值以外,作用类似于)。一些没有定义自己===
的类是数字类和String。
所以
case x
when 0
puts "Lots"
when Numeric
puts(100.0 / x)
when /^\d+$/
puts(100.0 / x.to_f)
default
raise ArgumentError, "x is not a number or numeric string"
end
是相同的
if 0 == x
puts "Lots"
elsif x.is_a? Numeric
puts(100.0 / x)
elsif x =~ /^\d+$/
puts(100.0 / x.to_f)
else
raise ArgumentError, "x is not a number or numeric string"
end
case x; when string --> if "string" == x
吗?
case x; when string
都等于if string === x
,如果string
包含字符串,则等于if string == x
。同样case x; when "string"
等同于if "string" === x
和if "string" == x
。
有趣的是,===
还用于匹配异常rescue
这是一个例子
class Example
def self.===(exception)
puts "Triple equals has been called."
true
end
end
raise rescue Example
# => prints "Triple equals has been called."
# => no exception raised
这用于匹配系统错误。
SystemCallError.===
已经定义为当两个具有相同的errno时返回true。使用此系统,只需列出错误代码之一,就可以修复具有相同错误编号的错误,例如Errno::EAGAIN
和Errno::EWOULDBLOCK
。