Perbedaan antara `not` dan`! `Di ruby

Jawaban:

143

Mereka hampir identik, tetapi tidak sepenuhnya. Perbedaannya adalah bahwa !memiliki prioritas lebih tinggi daripada not, sangat suka &&dan ||lebih diutamakan daripada anddan or.

!memiliki prioritas tertinggi dari semua operator, dan notsalah satu yang terendah, Anda dapat menemukan tabel lengkapnya di dokumen Ruby .

Sebagai contoh, pertimbangkan:

!true && false
=> false

not true && false
=> true

Dalam contoh pertama, !memiliki prioritas tertinggi , jadi Anda mengatakannya dengan efektif false && false.
Pada contoh kedua, notmemiliki prioritas lebih rendah dari true && false, jadi ini "mengalihkan" falsedari true && falseke true.

Panduan umum tampaknya adalah yang harus Anda patuhi !, kecuali Anda memiliki alasan khusus untuk menggunakannya not. !di Ruby berperilaku sama seperti kebanyakan bahasa lain, dan "kurang mengejutkan" daripada not.

Brennan
sumber
6
Saya telah menggunakan 'tidak' di masa lalu untuk membuat kondisional yang dinegasikan lebih mudah dibaca. Artinya jika keseluruhan persyaratan harus dinegasikan, saya merasa nyaman menggunakan 'tidak' daripada '!'. Saya suka ketika kode saya berbunyi seperti inglush
jaydel
@jaydel Bisakah Anda menggunakan unlessdalam kasus itu?
Jacob
1
@Jacob, ya, pasti. unlesstidak terlalu disukai di dunia ruby. Konsensus umum adalah bahwa itu hanya menghalangi ketika !bekerja dengan baik di kebanyakan situasi. Saya yakin ada kasus di mana kecuali mungkin lebih ekspresif, tetapi saya menghindari.
Brennan
4
Saya tidak setuju itu unlesstidak disukai. Hal terdekat yang kita miliki untuk sebuah konsensus mengatakan sebaliknya.
Adam Lassek
1
Hanya ingin berbagi contoh betapa mengejutkannya nothal itu. Dengan Python, saya terkadang menetapkan boolean ke variabel untuk membuat pernyataan-if lebih mudah dibaca. Itu mungkin berarti menggunakan pola x = not y, di mana y adalah sesuatu yang kompleks. Di Ruby, x = !yberfungsi, tetapi x = not ymendapat syntax error, unexpected tIDENTIFIER, expecting '('. Urutan prioritas berarti ini perlu kurung di sekitar kanan tugas op bekerja: x = (not y).
S. Kirby
13

Cara mudah untuk memahami notoperator adalah dengan melihat not true && falsesebagai yang setara!(true && false)

roniegh.dll
sumber