2017-04-26 8 views
-1

私は例を作りました。それだけの数2を使用するのと同じだし、それがtrueを返しているように、明らかに2のみ2.なぜFixnum && Fixnumが最後の番号を返すのですか?

+1

JavaScript、Python、* many * dynamic languagesと同じです。 – meagar

+2

あなたはここで何を求めていますか?なぜあなたの式は*任意の*言語で 'false'と評価されますか?あなたの '&&'が失敗する言語がないことを知っています。これは、 '22'または' 2 == 2'がブール 'false'にキャストされていることを意味します。 1つは非ゼロの数であり、1つはブール値の「真」である。 – meagar

+0

私は22 && 2が両方の数字を比較していると思っていましたが、それは起こっていません、今私は理解しています。 –

答えて

1

等しいため、このコードで

if 22 && 2 == 2 
    puts "true" 
else 
    puts "false" 
end 

は、見えます論理的に偽のRubyのものはnilfalseです。 0、空の文字列、空の配列、空のハッシュのようなものはすべてです。は論理的に真と見なされます。これは、trueまたはfalseのようなリテラルブール値に強制的にキャストする必要がないため、Rubyが&&および||のようなブール演算子をどのように処理するかに影響します。

このように、22 && 2は論理的に偽ではありません。

1 && 2 && 3 
# => 3 
1 && false && 3 
# => false 
1 && 2 && nil 
# => nil 

falseが存在する二つの用語のいずれかである場合&&操作はfalseを返します唯一の方法は次のとおりです。&&オペレータが動作する方法は、それが評価を破るか確認するために、最後の要素を返します。これは次のように発生する可能性があります。

1 && !1 
# => false 

これはfalseとしてので!1 evalutesです。

&&の結果が常にブール値であるいくつかの言語で使用されることがありますが、ここでは該当しません。

アップデート:trueと評価さ

22 && true 

:へのコースと同等である

22 && (2 == 2) 

:ここで指摘されて何@meagarは、あなたのコードが実際にこのように評価されています。

+0

ここには '22 && 2'はありません。それは '22 && true'です。 – meagar

+0

@meagerああ、正しいと思われる[precedence rules](https://ruby-doc.org/core-2.2.0/doc/syntax/precedence_rdoc.html)が原因です。 – tadman

関連する問題