web-dev-qa-db-ja.com

式(true == true == true)が構文エラーを生成するのはなぜですか?

ルビー

true == true == true

構文エラー、予期しないtEQ

vs. JavaScript

true == true == true
// => true

vs. [〜#〜] c [〜#〜]

1 == 1 == 1
// => 1
65
Rrr Rrr

引数が評価される演算子の順序を制御する関連付けの方向は、_==_メソッドには定義されません。_===_、_!=_、_=~_、および_<=>_メソッドも同様です(これらはすべて同じ優先順位を持ち、排他的に別の優先順位グループを形成します)。

ドキュメント

したがって、上記のリストの複数の演算子が連続して連鎖している場合の評価順序は、次のいずれかを介して明示的に設定する必要があります。

  • 括弧_()_:

    _(true == true) == true # => true
    true == (true == true) # => true
    _
  • またはドット演算子_._(は、行の最後の等価チェックでは省略できます):

    _true .== true == true # => true
    _
49
potashin

TL; DR構文は、3つすべての値が等しいことを暗示しています。これはjavascriptまたはCで実行されるものではないため、Ruby未来。

質問を正しく理解したら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と同様に動作します

6
Arye Eidelman

最初の答え は優れていますが、完全に明確でない場合(および理由を尋ねる人々)のために、ここにいくつかの例があります。


Cでは、==演算子は左から右への結合であり、ブール値は1(true)および0(false)として表されるため、最初の1 == 11(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
4
Mayo