回答:
and
と同じですが、優先順位&&
が低くなります。どちらも短絡評価を使用しています。
警告:and
優先順位がさらに低くなる=
ため、通常は回避する必要がありand
ます。and
使用すべき例は、Railsガイドの「ダブルレンダリングエラーの回避」にあります。
&&
、and
非常に特殊な場合にのみ使用するように指定することをお勧めします。
and
は、反転if
ステートメント修飾子としてです:にnext if widget = widgets.pop
なりwidget = widgets.pop and next
ます。これは、それを置くのに最適な方法です。本当に頭の中で「クリック」しました。(そしてor
反転unless
修飾子のようです。)
実用的な違いは結合の強さです。準備ができていないと、奇妙な動作を引き起こす可能性があります。
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
。
a = foo and bar
そして、 それよりも優先順位が低い(a = foo ) && bar
ことを証明しand
ます&&
。
a = foo and bar
と同等(a = :foo) and nil
です。割り当ては論理的に真の値(:foo
)を返すため、2番目の部分が評価され、失敗してが返されnil
ます。
Rubyのスタイルガイドは、私ができるより良い、それを言います:
&& / ||を使用 ブール式、および/または制御フロー。(経験則:外側の括弧を使用する必要がある場合は、間違った演算子を使用しています。)
# 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/を参照してください。
||
、or
よりも優先順位が低くなります=
」
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
の場合or
:
raise "Not ready!" unless ready_to_rock?
なる
ready_to_rock? or raise "Not ready!"
私が使用することを好むif
が、ないand
ので、if
より分かりやすいです私は無視して、and
とor
。
詳細については、「Rubyでの「and」および「or」の使用」を参照してください。
これがRubyの意図なのか、それともバグなのかはわかりませんが、以下のコードを試してください。このコードはRubyバージョン2.5.1で実行され、Linuxシステムで実行されました。
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
or
||
もご覧ください。