3 Equals或Case Equality运算符

在Ruby Integer === 5返回true 。 类似String === "karthik"返回true
但是, 5 === Integer返回false 。 而"karthik" === String
为什么操作员不能交换?

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

看看你自己的例子: 5是一个Integer 。 但Integer5吗? 这甚至意味着什么?

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

case subsumption运算符使用equals符号,并且它通常被称为三等于threequalscase equality运算符的case equality非常不幸的,因为它不仅与完全无关 ,而且它也不符合许多平等所遵循的法律,例如及物性和你提到的交换性。

对于我更多关于===咆哮,请参阅

  • ===运算符在Ruby中做了什么?
  • 在Ruby中=== vs. ==
  • Integer === 3如何工作?

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

 Class === String 

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

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

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

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

它非常有用:

 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语句中非常有用,但反向顺序并不多。

它需要在比较时实施案例

拥有非交换运算符是正常的。

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

并且当它发生时, ===部分作为case-when运算符存在。 这在Ruby中相当精细,如果必须简化为可交换操作则不可能如此。