在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参数是否可以包含在接收器之下。

这与caseexpression有什么关系? 简单:

 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::EAGAINErrno::EWOULDBLOCK相同错误号的错误,都可以通过列举其中的一个来获救。