3等しいまたは症例平等オペレーター
-
13-10-2019 - |
質問
ルビーで Integer === 5
戻り値 true
. 。同様に String === "karthik"
戻り値 true
.
でも、 5 === Integer
戻り値 false
. 。と "karthik" === String
.
なぜオペレーターが通勤していないのですか?
解決
簡単な答えは、それが意味をなさないからです。オペレーターが説明する関係は通勤ではありません。オペレーターはなぜですか?
あなた自身の例を見てください: 5
です Integer
. 。しかし、そうです Integer
a 5
?それも何ですか 平均?
===
それは 症例包摂演算子, 、および包摂は通勤しません。
ケースの包含演算子が使用するという事実は標識に等しく、通常は トリプルは等しい, threequals
また case equality
オペレーターはです ひどく 残念ながら、持っているだけではありません 何もない 平等に関係するが、それはまた、平等が適合する多くの法律に適合していない、遷移性や合業性などのように。
私の怒りの詳細については ===
見る
他のヒント
非常に簡単な理由の1つは、です is_a?
クラスの関係は、単に通勤することはできません。両方のオペランドがクラスである場合を考えてみましょう。
Class === String
これは真実で返されます String.is_a?(Class)
. 。でも String === Class
なぜなら、falseを返します Class.is_a?(String)
偽りであり、もちろんそうあるべきです。
もう1つの理由は、のセマンティクスです ===
左オペランドに依存します。これも2つの理由があります。a)左オペランドはメソッドコールの受信機であり、b)有用であるため、rubyでセマンティクスは常に左オペランドに依存します。意図されたセマンティクスの声明。
多くのオペレーターは通勤していません。
===
分岐がケースであるときに呼ばれるため、「ケース等式オペレーター」と呼ばれます。
それは素晴らしくて便利です:
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
繰り返しますが、aで非常に便利です case
声明、しかし逆の順序ではありません。
比較の場合は、ケースを実装する必要があります
非配信オペレーターがいるのは普通です。
/ - % [] . -> ^ << >> < <= > >= && || = += -= ,
そしてそれが起こるように、 ===
部分的には存在します ケース - いつ オペレーター。それはRubyではむしろ精巧であり、それが通勤OPに簡素化されなければならなかったとしてもそうではありませんでした。