Menggunakan 'atau' berbahaya. 'atau' memiliki tingkat kehadiran operator yang lebih rendah daripada '=', jadi berikut ini memiliki perilaku yang tidak terduga: a = salah atau benar #a salah setelah pernyataan ini
Tom G
20
@Yyy saat ini panduan merekomendasikan berpura-pura atau dan dan tidak ada (|| apakah itu & && dan?)
user3125280
67
Stand "Ruby Style Guide" saat ini berdiri The and and or keywords are banned. It's just not worth it. Always use && and || instead.. Dan itu benar, untuk alasan David dan Tom.
Andre Figueiredo
40
classObjectdef nil_zero?self.nil?||self==0endend# which lets you donil.nil_zero?# returns true0.nil_zero?# returns true1.nil_zero?# returns false"a".nil_zero?# returns falseunless discount.nil_zero?# do stuff...end
Waspadalah terhadap penafian biasa ... kekuatan besar / tanggung jawab, tambalan monyet mengarah ke sisi gelap dll.
Perhatikan bahwa ini adalah jawaban khusus rel . Vanila ruby tidak memiliki trymetode.
Tom Lord
Benar. Meskipun lebih seperti ActiveSupport-spesifik, yang jauh lebih ringan dan banyak digunakan daripada rel penuh. Pokoknya sekarang respon @ ndn adalah yang benar.
ditulis ulang
Diedit untuk menggunakan navigasi yang aman
ditulis ulang
1
Jawabannya sekarang menduplikasi stackoverflow.com/a/34819818/1954610 ... Saya pikir ada nilai dalam membiarkannya tryuntuk menunjukkan opsi alternatif (ini adalah alasan mengapa hal itu diputuskan di tempat pertama!), Asalkan jelas untuk pembaca yang ActiveSupportbukan ruby vanila.
Tom Lord
Poin diambil, jawaban bergulir kembali.
ditulis ulang
27
kecuali [nihil, 0] .termasuk? (diskon)
# ...
akhir
Saya menemukan ini mudah dibaca, dan saya lebih suka itu daripada kelas baru. Sudah selesai dilakukan dengan baik.
colincr
Pendekatan paling rubi dalam menangani dua kondisi.
Yugendran
23
Dari Ruby 2.3.0 dan seterusnya, Anda dapat menggabungkan operator navigasi aman ( &.) dengan Numeric#nonzero?. &.kembali niljika turunannya adalah nildan nonzero?- jika nomornya adalah 0:
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String.... Ini tidak aman untuk digunakan pada objek yang berubah-ubah.
Tom Lord
2
@ TomLord, seperti yang dinyatakan dalam komentar sebelumnya, ini tidak dimaksudkan untuk bekerja dengan objek yang berubah-ubah. Sebaliknya itu berkaitan dengan kasus ketika Anda memiliki sesuatu yang Anda tahu harus nomor, tetapi mungkin juga nil.
ndnenkov
Saya akan menjelaskan fakta itu dalam jawabannya, daripada seseorang membaca sekilas ini dan tidak melihat penafian dalam komentar.
Tom Lord
@TomLord, dinyatakan dalam jawaban " nonzero?- jika nomor itu 0" . Juga perlu memeriksa apakah objek yang sepenuhnya arbitrer 0muncul sangat jarang dibandingkan dengan yang memeriksa nomor yang mungkin atau mungkin tidak nil. Karena itu hampir tersirat. Bahkan jika seseorang entah bagaimana membuat asumsi yang bertentangan, mereka akan langsung mengerti apa yang terjadi ketika mereka mencoba untuk menjalankannya.
Urutannya adalah penting di sini, karena jika discountini nil, maka tidak akan memiliki zero?metode. Evaluasi hubung singkat Ruby harus mencegahnya untuk mencoba mengevaluasi discount.zero?, jika discountada nil.
Tidak berfungsi untuk objek sewenang-wenang . "".to_i == "foo".to_i == "0".to_i == 0. Metode Anda akan membuat segala jenis paksaan tipe yang tidak diinginkan. Ini juga akan gagal dengan NoMethodErrorjika discounttidak merespons to_i.
Tom Lord
2
def is_nil_and_zero(data)
data.blank?|| data ==0end
Jika kita "" lulus, itu akan mengembalikan false sedangkan kosong? mengembalikan true. Sama halnya dengan data = false kosong? mengembalikan true untuk string nil, false, kosong, atau spasi. Jadi lebih baik menggunakan blank? metode untuk menghindari string kosong juga.
Anda dapat menginisialisasi diskon ke 0 selama kode Anda dijamin tidak akan mencoba dan menggunakannya sebelum diinisialisasi. Itu akan menghapus satu cek saya kira, saya tidak bisa memikirkan hal lain.
Saya percaya yang berikut ini cukup baik untuk kode ruby. Saya tidak berpikir saya bisa menulis unit test yang menunjukkan perbedaan antara ini dan yang asli.
discount
itu salah?discount.in? [0, nil]
cara bersih mungkinJawaban:
sumber
The and and or keywords are banned. It's just not worth it. Always use && and || instead.
. Dan itu benar, untuk alasan David dan Tom.Waspadalah terhadap penafian biasa ... kekuatan besar / tanggung jawab, tambalan monyet mengarah ke sisi gelap dll.
sumber
ok, setelah 5 tahun berlalu ....
Penting untuk dicatat yang
try
didefinisikan dalam permata ActiveSupport, sehingga tidak tersedia di ruby biasa.sumber
try
metode.try
untuk menunjukkan opsi alternatif (ini adalah alasan mengapa hal itu diputuskan di tempat pertama!), Asalkan jelas untuk pembaca yangActiveSupport
bukan ruby vanila.sumber
Dari Ruby 2.3.0 dan seterusnya, Anda dapat menggabungkan operator navigasi aman (
&.
) denganNumeric#nonzero?
.&.
kembalinil
jika turunannya adalahnil
dannonzero?
- jika nomornya adalah0
:Atau postfix:
sumber
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String
.... Ini tidak aman untuk digunakan pada objek yang berubah-ubah.nil
.nonzero?
- jika nomor itu0
" . Juga perlu memeriksa apakah objek yang sepenuhnya arbitrer0
muncul sangat jarang dibandingkan dengan yang memeriksa nomor yang mungkin atau mungkin tidaknil
. Karena itu hampir tersirat. Bahkan jika seseorang entah bagaimana membuat asumsi yang bertentangan, mereka akan langsung mengerti apa yang terjadi ketika mereka mencoba untuk menjalankannya.sumber
Anda bisa melakukan ini:
Urutannya adalah penting di sini, karena jika
discount
ininil
, maka tidak akan memilikizero?
metode. Evaluasi hubung singkat Ruby harus mencegahnya untuk mencoba mengevaluasidiscount.zero?
, jikadiscount
adanil
.sumber
Anda dapat mengonversi baris kosong ke nilai integer dan memeriksa nol ?.
sumber
pembaruan, itu akan
false
untukdiscount = false
sumber
Anda dapat memanfaatkan metode yang
NilClass
disediakan#to_i
, yang akan mengembalikan nol untuknil
nilai:Jika
discount
bisa berupa angka pecahan, Anda bisa menggunakan#to_f
, untuk mencegah angka dibulatkan menjadi nol.sumber
"".to_i == "foo".to_i == "0".to_i == 0
. Metode Anda akan membuat segala jenis paksaan tipe yang tidak diinginkan. Ini juga akan gagal denganNoMethodError
jikadiscount
tidak meresponsto_i
.Jika kita "" lulus, itu akan mengembalikan false sedangkan kosong? mengembalikan true. Sama halnya dengan data = false kosong? mengembalikan true untuk string nil, false, kosong, atau spasi. Jadi lebih baik menggunakan blank? metode untuk menghindari string kosong juga.
sumber
blank?
adalah metode khusus rel, dan tidak tersedia di vanila ruby.Saat berurusan dengan catatan database , saya ingin menginisialisasi semua nilai kosong dengan 0, menggunakan bantuan migrasi:
sumber
Anda dapat menginisialisasi diskon ke 0 selama kode Anda dijamin tidak akan mencoba dan menggunakannya sebelum diinisialisasi. Itu akan menghapus satu cek saya kira, saya tidak bisa memikirkan hal lain.
sumber
sumber
Saya lebih suka menggunakan pendekatan yang lebih bersih:
val.to_i
akan mengembalikan0
jika val adalahnil
,setelah itu, yang perlu kita lakukan adalah memeriksa apakah nilai akhir adalah nol .
sumber
Solusi alternatif adalah menggunakan Perbaikan, seperti:
sumber
Saya percaya yang berikut ini cukup baik untuk kode ruby. Saya tidak berpikir saya bisa menulis unit test yang menunjukkan perbedaan antara ini dan yang asli.
sumber
true
apakah diskonnil
.