在Ruby中===与==
在Ruby中,==和===有什么区别? RDoc说
案例平等 – 对于类对象,实际上与调用#==相同,但通常被后代覆盖,以在case语句中提供有意义的语义。
#==
与==
相同吗? 你能否提供一个在案件陈述中何时/如何使用的例子?
两人真的没有任何关系。 尤其是, #==
是相等运算符, #===
与平等无关。 就我个人而言,我发现#===
与#==
类似,使用等号,并且通常被称为case 等于运算 符 , triple等于运算符或threequals运算符,当它与等号无关时,这是相当不幸的。
我打电话给#===
个案包容运算符 (这是我能想到的最好的,我愿意接受build议,特别是来自母语为英语的人)。
描述a === b
的最好方法是“如果我有一个抽屉标记为a
,那么把b
放进去是否有意义?
所以,例如, Module#===
testing是否b.is_a?(a)
。 如果你有Integer === 2
,那么把2
放在Integer
标签中是否合理? 是的,它确实。 Integer === 'hello'
怎么样Integer === 'hello'
? 很明显不是。
另一个例子是正则Regexp#===
。 它testing一场比赛。 将'hello'
放在标有/el+/
的框中有意义吗? 是的,它确实。
对于范围等集合, Range#===
定义为成员资格testing:如果元素位于集合中,则将元素放在标有集合的框中是有意义的。
所以,这就是#===
所做的:它testing参数是否可以包含在接收器之下。
这与case
expression有什么关系? 简单:
case foo when bar baz end
是相同的
if bar === foo baz end
是的, #==
文档是指“当前对象的实例方法==
”。
===
在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
有趣的是, ===
也用于匹配rescue
中的exception
这是一个例子
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
相同错误号的错误,都可以通过列举其中的一个来获救。