Jawaban:
and
sama seperti &&
tetapi dengan diutamakan lebih rendah . Keduanya menggunakan evaluasi hubung singkat .
PERINGATAN: and
bahkan memiliki prioritas lebih rendah daripada =
biasanya Anda ingin menghindari and
. Contoh kapan and
harus digunakan dapat ditemukan dalam Panduan Rails di bawah " Menghindari Kesalahan Render Ganda ".
&&
, sementara and
harus digunakan untuk kasus yang sangat spesifik.
and
adalah sebagai if
pengubah pernyataan terbalik : next if widget = widgets.pop
menjadi widget = widgets.pop and next
. Itu cara yang bagus untuk meletakkannya, benar-benar membuatnya" klik "di kepalaku (Dan or
seperti unless
pengubah 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 and
memiliki prioritas lebih rendah dari &&
.
a = foo and bar
setara 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
/ or
sepenuhnya, dan mereka mungkin ada benarnya. Seringkali penggunaannya dalam aliran kontrol dapat lebih jelas ditulis dengan if
/ unless
operator (misalnya document.save! unless document.saved?
)
||
dan &&
ikat dengan prioritas yang Anda harapkan dari operator boolean dalam bahasa pemrograman ( &&
sangat kuat, ||
sedikit kurang kuat).
and
dan or
memiliki prioritas lebih rendah.
Misalnya, tidak seperti ||
, or
memiliki prioritas lebih rendah daripada =
:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Demikian juga, tidak seperti &&
, and
juga memiliki prioritas lebih rendah daripada =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Terlebih lagi, tidak seperti &&
dan ||
, and
dan or
ikat 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 and
dan or
mungkin berguna untuk keperluan kontrol-aliran: lihat http://devblog.avdi.org/2010/08/02/using-and-and-and-and-or-in-ruby/ .
||
, or
memiliki prioritas lebih rendah dari =
" ... sekarang lebih masuk akal, terima kasih!
and
memiliki 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
and
memiliki 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 if
tetapi tidak and
, karena if
lebih dapat dimengerti, jadi saya abaikan saja and
dan 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
or
dan||
.