在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。