3 Equals或Case Equality运算符

时间:2010-12-24 16:11:09

标签: ruby equality commutativity

在Ruby Integer === 5中返回true。同样,String === "karthik"会返回true 但是,5 === Integer会返回false"karthik" === String 为什么操作员不能交换?

4 个答案:

答案 0 :(得分:34)

简单的答案是:因为它没有意义。操作员描述的关系不是可交换的,操作员为什么要这样?

请看一下您自己的示例:5Integer。但是Integer5吗?那甚至意味着什么

===案例包含运算符,并且包含不通勤。

案例包含运算符使用等号,并且通常称为三等于threequalscase equality运算符的事实非常不幸,因为它不仅绝对没有与平等相关,但它也不符合平等所遵循的许多法则,例如传递性和你提到的交换性。

有关===的更多咆哮,请参阅

答案 1 :(得分:7)

一个非常简单的原因是类的is_a?关系不能是可交换的。考虑两个操作数都是类的情况:

Class === String

这将返回true,因为String.is_a?(Class)。但是String === Class将返回false,因为Class.is_a?(String)是假的,当然应该是这样。

另一个原因是===的语义取决于它的左操作数。这还有两个原因:a)在ruby中,语义总是依赖于左操作数,因为左操作数是方法调用的接收者,而b)它是有用的,所以你可以使用例如具有预期语义的case语句中的类,范围和regexen。

答案 2 :(得分:2)

许多运营商都不是可交换的。

===被称为“案例等式运算符”,因为在分支是一种情况时会调用它。

这很好,很有用:

foo = 42
case foo
when Integer
  # branches here
when String
  # etc...
end

如果

,它将不会非常有用
foo = Integer
case foo
when 42
# would branch here??
when 666
# etc...
end

请注意,在Ruby 1.9中,Proc / lambda上的===运算符将调用Proc:

divisible_by_three = ->(x){x % 3 == 0}
divisible_by_three === 42 # => true

同样,在case语句中非常有用,但反向顺序并不多。

答案 3 :(得分:1)

它需要实现比较时的案例

拥有非交换运营商是正常的。

/ - % [] . -> ^ << >> < <= > >= && || = += -= ,

当发生这种情况时,===部分存在于 case-when 运算符中。这在Ruby中相当精细,如果必须将其简化为可交换的操作,则不可能如此。