Yanıtlar:
and
aynıdır &&
ancak önceliği düşüktür . Her ikisi de kısa devre değerlendirmesini kullanır .
UYARI: and
Hatta bundan =
kaçınmak isteyeceğinizden daha düşük önceliğe sahiptir and
. Ne zaman and
kullanı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
.
and
da tersine çevrilmiş bir if
ifade değiştirici: next if widget = widgets.pop
olur widget = widgets.pop and next
. Bu onu koymak için harika bir yol, gerçekten kafamda" tık "yaptı. (Ve or
tersine bir unless
değ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 ) && bar
olduğunu kanıtlar . and
&&
a = foo and bar
eş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
/ or
tamamen kaçınmayı söylüyor ve bir anlamı olabilir. Genellikle kontrol akışındaki kullanımları daha açık bir şekilde if
/ unless
operatö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ü).
and
ve or
daha 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 &&
, and
daha düşük önceliğe sahiptir =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Daha aksine ne var &&
ve ||
, and
ve or
bağ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 and
ve or
kontrol akışı amaçları için yararlı olabilir: bkz. Http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .
||
, or
daha 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
and
daha 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 if
ama kullanmıyorum and
, çünkü if
daha anlaşılır, bu yüzden görmezden geliyorum and
ve 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
||
.