Bir değişken nil ve sıfır değil kontrol etmek için aşağıdaki kodu kullanıyorum
if(discount != nil && discount != 0)
...
end
Bunu yapmanın daha iyi bir yolu var mı?
discount?
discount.in? [0, nil]daha temiz bir yol
Bir değişken nil ve sıfır değil kontrol etmek için aşağıdaki kodu kullanıyorum
if(discount != nil && discount != 0)
...
end
Bunu yapmanın daha iyi bir yolu var mı?
discount?
discount.in? [0, nil]daha temiz bir yol
Yanıtlar:
indirim olmadığı sürece. || indirim == 0 # ... son
The and and or keywords are banned. It's just not worth it. Always use && and || instead.. Ve doğru, David ve Tom nedenleriyle.
class Object
def nil_zero?
self.nil? || self == 0
end
end
# which lets you do
nil.nil_zero? # returns true
0.nil_zero? # returns true
1.nil_zero? # returns false
"a".nil_zero? # returns false
unless discount.nil_zero?
# do stuff...
end
Her zamanki yasal uyarılara dikkat edin ... büyük güç / sorumluluk, karanlık tarafa giden maymun yaması vb.
tamam, 5 yıl geçtikten sonra ....
if discount.try :nonzero?
...
end
tryActiveSupport gem'inde tanımlandığına dikkat etmek önemlidir , bu yüzden düz yakutta mevcut değildir.
tryyöntemi yoktur.
try kopyalıyor ... Bence bu alternatif seçeneği göstermek için ayrılmanın değeri olduğunu düşünüyorum (bu yüzden ilk etapta iptal edildi!), Açık olduğu sürece ActiveSupportvanilya yakut olmayan okuyucu .
sürece [nil, 0]. içerir? (indirim) # ... son
Ruby 2.3.0 ve sonrasında, güvenli navigasyon operatörünü ( &.) ile birleştirebilirsiniz Numeric#nonzero?. &.döndüren nilörnek olsaydı nilve nonzero?- sayı ise 0:
if discount&.nonzero?
# ...
end
Veya postfix:
do_something if discount&.nonzero?
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String.... Bu, keyfi nesneler için güvenli değildir.
nil.
nonzero?- eğer numara oldu 0" . Ayrıca, tamamen rasgele bir nesnenin olup olmadığını kontrol etme ihtiyacı 0, olabilecek bir sayıyı kontrol etmek için, buna kıyasla çok nadiren ortaya çıkar nil. Dolayısıyla neredeyse ima edilmektedir. Birisi bir şekilde zıt varsayımlarda bulunsa bile, onu yürütmeye çalıştığında ne olduğunu anında anlayacaklar.
Bunu yapabilirsin:
if (!discount.nil? && !discount.zero?)
Çünkü eğer sipariş, burada önemli olan discountise nil, o zaman olmaz zero?yöntemi. Ruby'nin kısa devre değerlendirmesi discount.zero?, eğer varsa discount, değerlendirmeye çalışmasını engellemelidir nil.
if discount and discount != 0
..
end
Güncelleştirme, olacak falseiçindiscount = false
Değerler için sıfır döndüren NilClasssağlanan #to_iyöntemden yararlanabilirsiniz nil:
unless discount.to_i.zero?
# Code here
end
Eğer discountkesirli sayılar olabilir kullanabilirsiniz #to_fsıfıra yuvarlanır olmaktan numarayı engellemek için, bunun yerine.
"".to_i == "foo".to_i == "0".to_i == 0. Metodunuz her türlü istenmeyen tipte baskı yapar. Ayrıca başarısız olur NoMethodErrorise discountyanıt vermez to_i.
def is_nil_and_zero(data)
data.blank? || data == 0
end
Eğer "" geçersek boş bırakılırsa yanlış döner? true değerini döndürür. Veri = yanlış boşluk olduğunda da durum aynı mı? sıfır, yanlış, boş veya boşluk alanı için true değerini döndürür. Boş kullanmak daha mı iyi? boş dize önlemek için yöntem.
blank?raylara özgü bir yöntemdir ve vanilya yakutunda mevcut değildir.
if discount.nil? || discount == 0
[do something]
end
Alternatif çözüm, aşağıdaki gibi Ayrıntılandırmaları kullanmaktır:
module Nothingness
refine Numeric do
alias_method :nothing?, :zero?
end
refine NilClass do
alias_method :nothing?, :nil?
end
end
using Nothingness
if discount.nothing?
# do something
end
Aşağıdaki yakut kodu için yeterince iyi olduğuna inanıyorum. Bu ve orijinal arasında herhangi bir fark gösteren bir birim testi yazabileceğimi sanmıyorum.
if discount != 0
end
trueİndirim olup olmadığını değerlendirir nil.