web-dev-qa-db-ja.com

Rubyの「and」と&&の違いは?

Rubyの&&演算子とand演算子の違いは何ですか?

294
Jakub Arnold

and&&と同じですが、 低優先順位 です。両方とも 短絡評価 を使用します。

警告:and=よりも優先順位が低いため、常にandを避けたい

327
Dominic Rodger

実用的な違いは結合強度です。これは、準備ができていない場合に特有の動作につながる可能性があります。

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にも機能します。

236
tadman

Ruby Style Guide は、私ができるよりも良いと言っています:

&&/||を使用しますブール式、および/または制御フロー用。 (経験則:外側の括弧を使用する必要がある場合、間違った演算子を使用しています。)

# boolean expression
if some_condition && some_other_condition
  do_something
end

# control flow
document.saved? or document.save!
58
Andrew Grimm

||&&は、プログラミング言語のブール演算子に期待される優先順位でバインドします(&&は非常に強力で、||はやや強力ではありません)。

andorの優先順位は低くなっています。

たとえば、||とは異なり、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/を参照

36
Gabe Kopley

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
17
Santhosh

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で「and」と「or」を使用

5
Feuda

これがRubyの意図なのか、これがバグなのかはわかりませんが、以下のコードを試してください。このコードはRubyバージョン2.5.1で実行され、Linuxシステムで実行されました。

puts 1 > -1 and 257 < 256
# => false

puts 1 > -1 && 257 < 256
# => true
0
Kevin Ng