Jawaban:
andsama seperti &&tetapi dengan diutamakan lebih rendah . Keduanya menggunakan evaluasi hubung singkat .
PERINGATAN: andbahkan memiliki prioritas lebih rendah daripada =biasanya Anda ingin menghindari and. Contoh kapan andharus digunakan dapat ditemukan dalam Panduan Rails di bawah " Menghindari Kesalahan Render Ganda ".
&&, sementara andharus digunakan untuk kasus yang sangat spesifik.
andadalah sebagai ifpengubah pernyataan terbalik : next if widget = widgets.popmenjadi widget = widgets.pop and next. Itu cara yang bagus untuk meletakkannya, benar-benar membuatnya" klik "di kepalaku (Dan orseperti unlesspengubah terbalik .)
Perbedaan praktisnya adalah kekuatan yang mengikat, yang dapat mengarah pada perilaku aneh jika Anda tidak siap untuk itu:
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
Hal yang sama berlaku untuk ||dan or.
a = foo and bar dan (a = foo ) && bar membuktikan bahwa andmemiliki prioritas lebih rendah dari &&.
a = foo and barsetara dengan (a = :foo) and nil. Karena penugasan mengembalikan nilai yang benar secara logis ( :foo) maka bagian kedua mengevaluasi, yang gagal, kembali nil.
The Ruby Style Guide mengatakan lebih baik daripada yang saya bisa:
Gunakan && / || untuk ekspresi boolean, dan / atau untuk aliran kontrol. (Aturan praktis: Jika Anda harus menggunakan tanda kurung luar, Anda menggunakan operator yang salah.)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
and/ orsepenuhnya, dan mereka mungkin ada benarnya. Seringkali penggunaannya dalam aliran kontrol dapat lebih jelas ditulis dengan if/ unlessoperator (misalnya document.save! unless document.saved?)
||dan &&ikat dengan prioritas yang Anda harapkan dari operator boolean dalam bahasa pemrograman ( &&sangat kuat, ||sedikit kurang kuat).
anddan ormemiliki prioritas lebih rendah.
Misalnya, tidak seperti ||, ormemiliki prioritas lebih rendah daripada =:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Demikian juga, tidak seperti &&, andjuga memiliki prioritas lebih rendah daripada =:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Terlebih lagi, tidak seperti &&dan ||, anddan orikat dengan prioritas yang sama:
> !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
Ikatan yang lemah anddan ormungkin berguna untuk keperluan kontrol-aliran: lihat http://devblog.avdi.org/2010/08/02/using-and-and-and-and-or-in-ruby/ .
||, ormemiliki prioritas lebih rendah dari =" ... sekarang lebih masuk akal, terima kasih!
andmemiliki prioritas lebih rendah dari &&.
Tetapi untuk pengguna yang sederhana, masalah mungkin terjadi jika digunakan bersama dengan operator lain yang diutamakan di antara, misalnya, operator penugasan:
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
andmemiliki prioritas lebih rendah, sebagian besar kami menggunakannya sebagai pengubah aliran kontrol seperti if:
next if widget = widgets.pop
menjadi
widget = widgets.pop and next
Untuk or:
raise "Not ready!" unless ready_to_rock?
menjadi
ready_to_rock? or raise "Not ready!"
Saya lebih suka menggunakan iftetapi tidak and, karena iflebih dapat dimengerti, jadi saya abaikan saja anddan or.
Lihat " Menggunakan" dan "dan" atau "di Ruby " untuk informasi lebih lanjut.
Saya tidak tahu apakah ini maksud Ruby atau apakah ini bug tetapi coba kode ini di bawah ini. Kode ini dijalankan pada Ruby versi 2.5.1 dan pada sistem Linux.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
ordan||.