3 Equals或Case Equality运算符

kar*_*iks 21 ruby equality commutativity

在Ruby中Integer === 5返回true.同样String === "karthik"回报true.
但是,5 === Integer退货false.并且"karthik" === String.
为什么操作员不能交换?

Jör*_*tag 35

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

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

===包含运算符情况,并且包含不通勤.

该情况下,包容操作员使用的事实等号,而且它通常被称为三重等号,threequalscase equality运营商是非常不幸的,因为它不仅拥有绝对没有做平等的,但它也并不符合许多法律是平等符合,如传递性和你提到的交换性.

欲了解更多我对咆哮===


sep*_*p2k 7

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

Class === String
Run Code Online (Sandbox Code Playgroud)

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

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