Ruby'de “ve” ve && arasındaki fark nedir?


Yanıtlar:


349

andaynıdır &&ancak önceliği düşüktür . Her ikisi de kısa devre değerlendirmesini kullanır .

UYARI: andHatta bundan =kaçınmak isteyeceğinizden daha düşük önceliğe sahiptir and. Ne zaman andkullanılması gerektiğine ilişkin bir örnek, " Çift İşleme Hatalarından Kaçınmak " başlığı altındaki Raylar Kılavuzunda bulunabilir .


50
Sadece çok özel durumlar için kullanılmalı &&, ancak genellikle kullanılması gerektiğini belirtmek iyi bir fikirdir and.
Marc-André Lafortune


17
Andrew Marshall'ın bağlantısından: "Düşünmenin başka bir yolu andda tersine çevrilmiş bir ififade değiştirici: next if widget = widgets.popolur widget = widgets.pop and next. Bu onu koymak için harika bir yol, gerçekten kafamda" tık "yaptı. (Ve ortersine bir unlessdeğiştirici gibi .)
GMA

1
Bu cevabı tadman'ın cevabının ayrıntıları ile birleştirin ve tüm resmi elde edin.
sargas

5
Avdi ne zaman kullanılacağını ve && ile karşılaştırmasını güncelledi. Temel olarak düşük öncelikleri nedeniyle kontrol akışı için 've' ve 'veya' kullanın. devblog.avdi.org/2014/08/26/…
EricC

238

Pratik fark, bağlama gücüdür, eğer buna hazır değilseniz tuhaf davranışlara yol açabilir:

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

Aynı şey ||ve için de geçerlidir or.


2
a = foo and bar ve önceliği daha düşük (a = foo ) && barolduğunu kanıtlar . and&&
sargas

anlamıyorum: "foo ve bar" geri dönmek için ne anlama geliyor?
BKSpurgeon

a = foo and bareşittir (a = :foo) and nil. Ödev mantıksal olarak doğru bir değer ( :foo) döndürdüğünden , ikinci bölüm, başarısız olan ve geri dönen değerlendirir nil.
tadman

61

Yakut Stil Kılavuzu I could daha iyi diyor:

&& / || kullanın boole ifadeleri ve / veya kontrol akışı için. (Temel kural: Dış parantez kullanmanız gerekiyorsa, yanlış işleçleri kullanıyorsunuz.)

# boolean expression
if some_condition && some_other_condition
  do_something
end

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

53
Aslında rehber şimdiand / ortamamen kaçınmayı söylüyor ve bir anlamı olabilir. Genellikle kontrol akışındaki kullanımları daha açık bir şekilde if/ unlessoperatörler ile daha açık bir şekilde yazılabilir (örneğin document.save! unless document.saved?)
Yarin

@akostadinov, troll etmemeniz durumunda: Ruby Stil rehberi Ruby'nin yaratıcıları tarafından yazılmıyor. Ruby Yukihiro Matsumoto ve diğerleri tarafından yaratılırken, Ruby Stil Rehberi çoğunlukla Bozhidar Batsov tarafından yapıldı.
Andrew Grimm

2
@ AndrewGrimm, teşekkürler, bilmek güzel. Trol ettiğim için özür dilerim ama yakut gerçekliğin bazı yönleriyle içtenlikle kafam karıştı. Kesin olan bir şey var - her yakut projenin kod tabanını sürdürülebilir tutmak için katı stil politikalarına ihtiyacı var.
akostadinov

37

||ve &&programlama dillerinde boole operatörlerinden beklediğiniz önceliğe bağlanın ( &&çok güçlü, ||biraz daha az güçlü).

andve ordaha düşük önceliğe sahiptir.

Örneğin, aksine ||, orönceliği daha düşüktür =:

> a = false || true
 => true 
> a
 => true 
> a = false or true
 => true 
> a
 => false

Aynı şekilde, aksine &&, anddaha düşük önceliğe sahiptir =:

> a = true && false
 => false 
> a
 => false 
> a = true and false
 => false 
> a
 => true 

Daha aksine ne var &&ve ||, andve orbağlama eşit önceliğe sahip:

> !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

Zayıf bağlanma andve orkontrol akışı amaçları için yararlı olabilir: bkz. Http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .


2
"aksine ||, ordaha düşük önceliğe sahiptir =" ... şimdi daha mantıklı, teşekkürler!
Steph Sharp

18

andönceliği daha düşüktür &&.

Ancak mütevazi bir kullanıcı için, önceliği atama operatörü arasında olan diğer operatörlerle birlikte kullanılırsa sorunlar oluşabilir:

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
Teşekkür ederim, ama "ve" nin önceliği "&&" den nasıl farklıdır?
BKSpurgeon

2
@BKSpurgeon Ruby'deki operatör önceliğinin sıralı bir listesi için buraya bakın .
thutt

5

anddaha düşük önceliğe sahiptir, çoğunlukla bunu bir kontrol akışı değiştirici olarak kullanırız if:

next if widget = widgets.pop

olur

widget = widgets.pop and next

Şunun için or:

raise "Not ready!" unless ready_to_rock?

olur

ready_to_rock? or raise "Not ready!"

Kullanmayı tercih ediyorum ifama kullanmıyorum and, çünkü ifdaha anlaşılır, bu yüzden görmezden geliyorum andve or.

Daha fazla bilgi için "Ruby'de " ve "ve" veya " kullanma" konusuna bakın .


0

Bu Ruby niyet veya bu bir hata olup olmadığını bilmiyorum ama aşağıda bu kodu deneyin. Bu kod Ruby 2.5.1 sürümünde çalıştırıldı ve bir Linux sistemindeydi.

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

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

1
@ JakubArnold Sarcasm asla yardımcı olmaz. Örnekler bazen.
BobRodes

@BobRodes Bu bir alaycılık değildi. 6'sının zaten örnekleri olan 7 cevap var.
Jakub Arnold

1
@JakubArnold Bu örneği hala yararlı buldum.
BobRodes

Ben de garip sonuçlar alıyorum. v1 = doğru ve yanlış p v1 # => app.rb: true, IRB: false v2 = true && false p v2 # => app.rb: false, IRB: false 1> -1 && 257 <256 # => app.rb: yanlış, IRB: yanlış
Rich_F
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.