ルビー:
true == true == true
構文エラー、予期しないtEQ
vs. JavaScript:
true == true == true
// => true
vs. [〜#〜] c [〜#〜]:
1 == 1 == 1
// => 1
引数が評価される演算子の順序を制御する関連付けの方向は、_==
_メソッドには定義されません。_===
_、_!=
_、_=~
_、および_<=>
_メソッドも同様です(これらはすべて同じ優先順位を持ち、排他的に別の優先順位グループを形成します)。
したがって、上記のリストの複数の演算子が連続して連鎖している場合の評価順序は、次のいずれかを介して明示的に設定する必要があります。
括弧_()
_:
_(true == true) == true # => true
true == (true == true) # => true
_
またはドット演算子_.
_(は、行の最後の等価チェックでは省略できます):
_true .== true == true # => true
_
質問を正しく理解したらvalue_a == value_b == value_c
は、このメソッドに示されているように、比較演算子として==を使用するすべてがeqelである場合にのみtrueを返す必要があります。
# version 1
def compare_3_values(a, b, c)
a == b && a == c && b == c
end
ただし、別の予想される結果があります。前の回答に示されているようにこれを実装するには:
#version 2
def compare_3_values(a, b, c)
(a == b) == c
end
結果は世界から離れています。
JavaScriptは常にバージョン2を使用しますが、3番目のアイテムは常にtrueまたはfalse(3番目のアイテムが整数の場合は0または1)と比較されるため、かなり役に立たないのでfalse == false == true
はtrueを返します。
メソッドが一度だけ呼び出される3つの値のいずれかである場合、3つの変数すべてのコピー(参照ではない)を作成し、次のような比較を行う必要があります。
def compare_3_values(a_original, b_original, c_original)
#duplicate all three values as a, b, c
a, b, c = a_original.dup, b_original.dup, c_original.dup
a == b && b == c && a == c
end
良いニュースは、Rubyが構文エラーを与えるため、全員のコードを壊さずにこれを実装できる唯一の言語です。
他の言語の場合、コードが非常に壊れるため、後のメジャーバージョンで実装されたとしても、今後数年間はこれをオンまたはオフにするフラグ/設定が必要になるため、価値はありません。
Rubyでの興味深い結果
false .== false == true
=> true
false .== true == false
=> true
true .== false == false
=> true
false .== false == false
=> false
true .== true == false
false
そしてjavascriptで
false == false == true
=> true
false == true == false
=> true
true == false == false
=> true
false == false == false
=> false
true == true == false
=> false
編集 Cでもテストされ、最初の2つの値の結果を3番目の値と比較するという点でJavaScriptと同様に動作します
最初の答え は優れていますが、完全に明確でない場合(および理由を尋ねる人々)のために、ここにいくつかの例があります。
Cでは、==
演算子は左から右への結合であり、ブール値は1(true)および0(false)として表されるため、最初の1 == 1
は1
(true)と評価されます。そして、最初の式の結果を2番目の式で評価しています。あなたが試すことができます:
2 == 2 == 2 // => 0
Cでは、次のように評価されます。
(2 == 2) == 2
1 == 2 // => 0
Javascriptでは、Cと同様に、==
は左から右への連想です。今回は0で試してみましょう(ただし、Cの同じ例でも同様に機能します)。
0 == 0 == 0
false
再び:
0 == 0 == 0
true == 0 // => false
In Ruby ==
には連想プロパティがありません。つまり、単一の式で複数回使用できないため、式を評価できません。その決定が行われた理由さらに、Rubyは数値1をブール値として定義しないため、1 == true
はfalseと評価されます。
2番目の答え は、Rubyに「奇妙な」ケースがいくつかあると述べていますが、それらはすべて期待どおりに評価されます。
(1 == 1) == 1
true == 1 # => false
1 == (1 == 1)
1 == true # => false
1 .== 1 == 1
(1 == 1) == 1
true == 1 # => false
false .== false == true
(false == false) == true
true == true # => true
false .== true == false
(false == true) == false
false == false # => true
true .== false == false
(true == false) == false
false == false # => true
false .== false == false
(false == false) == false
true == false # => false
true .== true == false
(true == true) == false
true == false # => false