题
在红宝石中 Integer === 5
返回 true
. 。相似地 String === "karthik"
返回 true
.
然而, 5 === Integer
返回 false
. 。和 "karthik" === String
.
为什么操作员不接值?
解决方案
简单的答案是:因为这没有意义。操作员描述的关系不是交换性的,为什么操作员应该是?
只需查看您自己的示例: 5
是一个 Integer
. 。但是 Integer
一个 5
?那甚至是什么 意思是?
===
是个 案例包含操作员, ,并且收集不上下班。
案件包含操作员使用的事实平等符号,通常称为 三重平等, threequals
或者 case equality
操作员是 可怕 不幸的是,它不仅有 绝对没有 处理平等,但它也不符合平等符合的许多法律,例如传递性和您提到的换算性。
我对我的更多咆哮 ===
看
其他提示
一个非常简单的原因是 is_a?
课堂的关系不能是可交换的。考虑两个操作数是类的情况:
Class === String
这将返回true,因为 String.is_a?(Class)
. 。然而 String === Class
会返回false,因为 Class.is_a?(String)
是错误的,当然是应该的。
另一个原因是 ===
取决于其左操作数。这又有两个原因:a)在Ruby中,语义始终取决于左操作数,因为左操作数是方法调用的接收器,b)它很有用,因此您可以在某种情况下使用EG类,范围和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
声明,但不超过相反的顺序。
当比较时,它需要实施案例
拥有非交通运营商是正常的。
/ - % [] . -> ^ << >> < <= > >= && || = += -= ,
而且碰巧 ===
部分存在 案例 操作员。在Ruby中,这是相当复杂的,如果必须将其简化为可交换的OP,那就不可能了。