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


回答:


349

andと同じですが、優先順位&&低くなります。どちらも短絡評価を使用しています。

警告:and優先順位がさらに低くなる=ため、通常は回避する必要がありandます。and使用すべき例は、Railsガイドの「ダブルレンダリングエラーの回避」にあります。


50
通常はを使用し&&and非常に特殊な場合にのみ使用するように指定することをお勧めします。
マルク=アンドレ・Lafortune


17
Andrew Marshallのリンクから:「もう1つの考え方andは、反転ifステートメント修飾子としてです:にnext if widget = widgets.popなりwidget = widgets.pop and nextます。これは、それを置くのに最適な方法です。本当に頭の中で「クリック」しました。(そしてor反転unless修飾子のようです。)
GMA

1
この回答とタッドマンの回答の詳細を組み合わせると、全体像がわかります。
sargas 14

5
Avdiは、いつ使用するか、および&&を使用する場合の彼の見解を更新しました。優先順位が低いため、基本的に制御フローには「and」と「or」を使用します。 devblog.avdi.org/2014/08/26/...
EricC

238

実用的な違いは結合の強さです。準備ができていないと、奇妙な動作を引き起こす可能性があります。

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


2
a = foo and bar そして、 それよりも優先順位が低い(a = foo ) && barことを証明しandます&&
sargas 14

わかりません。「foo and bar」は何を返すのですか?
BKSpurgeon

a = foo and barと同等(a = :foo) and nilです。割り当ては論理的に真の値(:foo)を返すため、2番目の部分が評価され、失敗してが返されnilます。
tadman

61

Rubyのスタイルガイドは、私ができるより良い、それを言います:

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

# boolean expression
if some_condition && some_other_condition
  do_something
end

# control flow
document.saved? or document.save!

53
実際、ガイドは今やand / or完全に避けるように言っています、そして彼らはポイントを持っているかもしれません。多くの場合、制御フローでのそれらの使用法は、とにかく/ 演算子でより明確に記述できますifunless(例:document.save! unless document.saved?
Yarin

トローリングをしていなかった場合のための@akostadinov:Rubyスタイルガイドは、Rubyの作成者が作成したものではありません。Rubyは松本幸宏らによって作成され、RubyスタイルガイドはにBozhidar Batsovによって作成されました。
Andrew Grimm 14

2
@AndrewGrimm、ありがとう、知っておくと良い。トローリングしてすみませんが、ルビーの現実のいくつかの側面に心から混乱しています。確かなことが1つあります。すべてのRubyプロジェクトには、コードベースの保守を維持するための厳密なスタイルポリシーが必要です。
akostadinov 2014

37

||そして&&あなたがプログラミング言語で論理演算子に期待することを優先してバインドが(&&非常に強く、||やや少ない強力です)。

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

弱いバインディングandorあり、制御フローの目的に役立つ場合があります。http//devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/を参照してください。


2
「とは異なり||orよりも優先順位が低くなります=
Steph Sharp、

18

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

1
ありがとうございます。「and」の優先順位は「&&」とどのように異なりますか?
BKSpurgeon 2016年

2
@BKSpurgeon Rubyでの演算子の優先順位の順序付きリストについては、こちらを参照してください。
17

5

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より分かりやすいです私は無視して、andor

詳細については、「Rubyでのand」および「or」の使用」を参照してください。


0

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

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

puts 1 > -1 && 257 < 256
# => true

1
@JakubArnold皮肉は役に立ちません。例は時々です。
BobRodes

@BobRodes皮肉じゃなかった。7つの回答があり、そのうち6つにはすでに例があります。
Jakub Arnold

1
@JakubArnoldこの例はまだ役に立ちました。
BobRodes

私も奇妙な結果を得ています。v1 = trueおよびfalse p v1#=> app.rb:true、IRB:false v2 = true && false p v2#=> app.rb:false、IRB:false puts 1> -1 && 257 <256#=> app.rb:false、IRB:false
Rich_F
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.