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 ".
Ini akan menjadi ide yang baik untuk menentukan bahwa seseorang biasanya harus menggunakan &&, sementara andharus digunakan untuk kasus yang sangat spesifik.
Dari tautan Andrew Marshall: "Cara lain untuk berpikir 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 .)
GMA
1
Gabungkan jawaban ini dengan perincian jawaban tadman dan Anda mendapatkan keseluruhan gambarannya.
sargas
5
Avdi memperbarui pendapatnya tentang kapan harus menggunakan dan vs. &&. Pada dasarnya gunakan 'dan' dan 'atau' untuk aliran kontrol karena mereka lebih diutamakan. devblog.avdi.org/2014/08/26/…
EricC
238
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
a = foo and bardan(a = foo ) && bar membuktikan bahwa andmemiliki prioritas lebih rendah dari &&.
sargas
saya tidak mengerti: apa yang dimaksud dengan "foo and bar" untuk kembali?
BKSpurgeon
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.
tadman
61
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.)
@akostadinov jika Anda tidak trolling: panduan Ruby Style tidak ditulis oleh pembuat Ruby. Ruby dibuat oleh Yukihiro Matsumoto dan yang lainnya, sedangkan Ruby Style Guide terutama oleh Bozhidar Batsov.
Andrew Grimm
2
@AndrewGrimm, terima kasih, senang tahu. Maaf untuk trolling tapi saya benar-benar bingung dengan beberapa aspek realitas ruby. Satu hal yang pasti - setiap proyek ruby membutuhkan kebijakan gaya yang ketat untuk menjaga basis kode tetap terpelihara.
akostadinov
37
||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 =falseortrue=>true> a=>false
Demikian juga, tidak seperti &&, andjuga memiliki prioritas lebih rendah daripada =:
> a =true&&false=>false> a=>false> a =trueandfalse=>false> a=>true
Terlebih lagi, tidak seperti &&dan ||, anddan orikat dengan prioritas yang sama:
"tidak seperti ||, ormemiliki prioritas lebih rendah dari =" ... sekarang lebih masuk akal, terima kasih!
Steph Sharp
18
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;enddef 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
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.
or
dan||
.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 menghindariand
. Contoh kapanand
harus digunakan dapat ditemukan dalam Panduan Rails di bawah " Menghindari Kesalahan Render Ganda ".sumber
&&
, sementaraand
harus digunakan untuk kasus yang sangat spesifik.and
adalah sebagaiif
pengubah pernyataan terbalik :next if widget = widgets.pop
menjadiwidget = widgets.pop and next
. Itu cara yang bagus untuk meletakkannya, benar-benar membuatnya" klik "di kepalaku (Danor
sepertiunless
pengubah terbalik .)Perbedaan praktisnya adalah kekuatan yang mengikat, yang dapat mengarah pada perilaku aneh jika Anda tidak siap untuk itu:
Hal yang sama berlaku untuk
||
danor
.sumber
a = foo and bar
dan(a = foo ) && bar
membuktikan bahwaand
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, kembalinil
.The Ruby Style Guide mengatakan lebih baik daripada yang saya bisa:
sumber
and
/or
sepenuhnya, dan mereka mungkin ada benarnya. Seringkali penggunaannya dalam aliran kontrol dapat lebih jelas ditulis denganif
/unless
operator (misalnyadocument.save! unless document.saved?
)||
dan&&
ikat dengan prioritas yang Anda harapkan dari operator boolean dalam bahasa pemrograman (&&
sangat kuat,||
sedikit kurang kuat).and
danor
memiliki prioritas lebih rendah.Misalnya, tidak seperti
||
,or
memiliki prioritas lebih rendah daripada=
:Demikian juga, tidak seperti
&&
,and
juga memiliki prioritas lebih rendah daripada=
:Terlebih lagi, tidak seperti
&&
dan||
,and
danor
ikat dengan prioritas yang sama:Ikatan yang lemah
and
danor
mungkin berguna untuk keperluan kontrol-aliran: lihat http://devblog.avdi.org/2010/08/02/using-and-and-and-and-or-in-ruby/ .sumber
||
,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:
sumber
and
memiliki prioritas lebih rendah, sebagian besar kami menggunakannya sebagai pengubah aliran kontrol sepertiif
:menjadi
Untuk
or
:menjadi
Saya lebih suka menggunakan
if
tetapi tidakand
, karenaif
lebih dapat dimengerti, jadi saya abaikan sajaand
danor
.Lihat " Menggunakan" dan "dan" atau "di Ruby " untuk informasi lebih lanjut.
sumber
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.
sumber