在Ruby Integer === 5
中返回true
。同样,String === "karthik"
会返回true
但是,5 === Integer
会返回false
。 "karthik" === String
为什么操作员不能交换?
答案 0 :(得分:34)
简单的答案是:因为它没有意义。操作员描述的关系不是可交换的,操作员为什么要这样?
请看一下您自己的示例:5
是Integer
。但是Integer
是5
吗?那甚至意味着什么?
===
是案例包含运算符,并且包含不通勤。
案例包含运算符使用等号,并且通常称为三等于,threequals
或case 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中相当精细,如果必须将其简化为可交换的操作,则不可能如此。