Yanıtlar:
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 .
&&, ancak genellikle kullanılması gerektiğini belirtmek iyi bir fikirdir and.
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 .)
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.
a = foo and bar ve önceliği daha düşük (a = foo ) && barolduğunu kanıtlar . and&&
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.
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!
and / 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?)
||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/ .
||, ordaha düşük önceliğe sahiptir =" ... şimdi daha mantıklı, teşekkürler!
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
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 .
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
or||.