Rubyの&&
演算子とand
演算子の違いは何ですか?
実用的な違いは結合強度です。これは、準備ができていない場合に特有の動作につながる可能性があります。
foo = :foo
bar = nil
a = foo and bar
# => nil
a
# => :foo
a = foo && bar
# => nil
a
# => nil
a = (foo and bar)
# => nil
a
# => nil
(a = foo) && bar
# => nil
a
# => :foo
同じことが||
とor
にも機能します。
Ruby Style Guide は、私ができるよりも良いと言っています:
&&/||を使用しますブール式、および/または制御フロー用。 (経験則:外側の括弧を使用する必要がある場合、間違った演算子を使用しています。)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
||
と&&
は、プログラミング言語のブール演算子に期待される優先順位でバインドします(&&
は非常に強力で、||
はやや強力ではありません)。
and
とor
の優先順位は低くなっています。
たとえば、||
とは異なり、or
は=
よりも優先順位が低くなります。
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
同様に、&&
とは異なり、and
は=
よりも優先順位が低くなります。
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
さらに、&&
および||
とは異なり、and
およびor
は同じ優先順位でバインドします。
> !puts(1) || !puts(2) && !puts(3)
1
=> true
> !puts(1) or !puts(2) and !puts(3)
1
3
=> true
> !puts(1) or (!puts(2) and !puts(3))
1
=> true
弱結合のand
およびor
は、制御フローの目的に役立つ場合があります: http://devblog.avdi.org/2010/08/02/using-and-and-or-in-Ruby/を参照 。
and
は、&&
よりも優先順位が低くなっています。
ただし、控えめなユーザーの場合、優先順位が間にある他の演算子(代入演算子など)と一緒に使用すると問題が発生する可能性があります。
例えば
def happy?() true; end
def know_it?() true; end
todo = happy? && know_it? ? "Clap your hands" : "Do Nothing"
todo
# => "Clap your hands"
todo = happy? and know_it? ? "Clap your hands" : "Do Nothing"
todo
# => true
andの優先順位は低く、主にifなどの制御フロー修飾子として使用します
next if widget = widgets.pop
になる
widget = widgets.pop and next
foror
raise "Not ready!" unless ready_to_rock?
になる
ready_to_rock? or raise "Not ready!"
私はifを使用したいが、andではなく、ifの方がわかりやすい、したがって、andおよびorは無視します。
への参照
これがRubyの意図なのか、これがバグなのかはわかりませんが、以下のコードを試してください。このコードはRubyバージョン2.5.1で実行され、Linuxシステムで実行されました。
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true