3 Equals或Case Equality运算符
在Ruby Integer === 5
返回true
。 类似String === "karthik"
返回true
。
但是, 5 === Integer
返回false
。 而"karthik" === String
。
为什么操作员不能交换?
简单的答案是:因为它没有意义。 操作员描述的关系不是可交换的,操作员为什么要这样?
看看你自己的例子: 5
是一个Integer
。 但Integer
是5
吗? 这甚至意味着什么?
===
是case包含运算符 ,并且包含不通勤。
case subsumption运算符使用equals符号,并且它通常被称为三等于 , threequals
或case 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中相当精细,如果必须简化为可交换操作则不可能如此。