Yakutta bir değişkenin sıfır ve sıfır olmadığını kontrol etme


Yanıtlar:


428
indirim olmadığı sürece. || indirim == 0
  # ...
son

31
|| yerine 'veya' kullanın
Orion Edwards

93
@ orion-edwards neden?
NARKOZ

39
'Veya' kullanmak tehlikelidir. 'veya' operatörün sunumunu '=' değerinden daha düşüktür, bu nedenle aşağıdakilerin beklenmedik davranışları vardır: a = false veya true #a bu ifadeden sonra false
Tom G

20
@xiy şu anda rehber taklit önerir ve ve yoktur (|| bu veya && ve?)
user3125280

67
Mevcut "Ruby Stil Kılavuzu" duruyor The and and or keywords are banned. It's just not worth it. Always use && and || instead.. Ve doğru, David ve Tom nedenleriyle.
Andre Figueiredo

40
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.


28

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.


7
Bunun raya özel bir cevap olduğunu unutmayın. Vanilya yakutunun bir tryyöntemi yoktur.
Tom Lord

Doğru. ActiveSupport'a özgü olmasına rağmen, tam raylardan çok daha hafif ve yaygın olarak kullanılan bir bağımlılıktır. Her neyse şimdi @ ndn'nin yanıtı doğru.
yeniden yazılabilir

Güvenli navigasyonu kullanmak için düzenlendi
yeniden yazıldı

1
Cevap şimdi stackoverflow.com/a/34819818/1954610try 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 .
Tom Lord

Nokta alındı, cevap geri alındı.
yeniden yazıldı

27
sürece [nil, 0]. içerir? (indirim) 
  # ...
son

13
Güzel? Evet. Okunabilir? Pek sayılmaz.
El Ninja Trepador

1
Bunu mükemmel okunabilir buluyorum ve yeni bir sınıfa tercih ederim. Aferin.
colincr

İki koşulu ele almada en yakut yaklaşım.
Yugendran

23

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.
Tom Lord

2
@TomLord, önceki yorumda belirtildiği gibi, bunun keyfi nesnelerle çalışması amaçlanmamıştı. Bunun yerine, bir sayı olması gerektiğini bildiğiniz bir şey olması durumunda da olabilir nil.
ndnenkov

Birinin bunu gözden kaçırması ve yorumlarda feragatnameyi görmemesi yerine, cevabı açıklığa kavuştururdum.
Tom Lord

@TomLord, bu cevap belirtildiği " 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.
ndnenkov


15

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.


11

Boş satırınızı tamsayı değerine dönüştürebilir ve sıfırı kontrol edebilirsiniz.

"".to_i.zero? => true
nil.to_i.zero? => true

dikkatli: 0.1.to_i == 0
Simon B.

3
if discount and discount != 0
  ..
end

Güncelleştirme, olacak falseiçindiscount = false


2

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.


Bu @ oivoodo'nun cevabı ile aynı değil mi?
Cary Swoveland

Rasgele nesneler için çalışmaz . "".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.
Tom Lord

2
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.


1
blank?raylara özgü bir yöntemdir ve vanilya yakutunda mevcut değildir.
Tom Lord

Haklısın!! Ben bu kadar burada yayınlanan "ror" etiketi ile ilgili olduğunu düşündüm. Benim hatam. Bu vanilya yakutunda işe yaramayacak.
Saroj

1

Bir veritabanı kaydı ile uğraşırken , taşıma yardımcısını kullanarak tüm boş değerleri 0 ile başlatmak istiyorum:

add_column :products, :price, :integer, default: 0

0

Kodunuz başlatılmadan önce denememeniz ve kullanmamanız garanti edildiği sürece indirimi 0 olarak başlatabilirsiniz. Sanırım bir çek kaldıracak, başka bir şey düşünemiyorum.



0

Daha temiz bir yaklaşım kullanmayı tercih ederim:

val.to_i.zero?

val.to_iBir dönecektir 0eğer val bir olduğunu nil,

bundan sonra, tek yapmamız gereken son değerin sıfır olup olmadığını kontrol etmektir .


-1

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

-7

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

8
trueİndirim olup olmadığını değerlendirir nil.
Andrew Grimm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.