wake-up-neo.net

Prüfen, ob eine Variable in Ruby nicht gleich null und nicht null ist

Ich verwende den folgenden Code, um zu überprüfen, ob eine Variable nicht Null und nicht Null ist

if(discount != nil && discount != 0) 
  ...
end

Gibt es einen besseren Weg, dies zu tun?

224
hectorsq
 wenn nicht rabatt.nil? || Rabatt == 0 
 # ...
Ende
371
Dejan Simic
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

Hüten Sie sich vor den üblichen Haftungsausschlüssen ... große Macht/Verantwortung, Affen-Patching führt zur dunklen Seite usw.

39
madlep

ok, nachdem 5 jahre vergangen sind ....

if discount.try :nonzero?
  ...
end

Beachten Sie, dass try im ActiveSupport-Gem definiert ist und daher nicht in reinem Ruby verfügbar ist.

26
rewritten
 Es sei denn, [null, 0] .include? (Rabatt) 
 # ...
Ende
25
Dejan Simic

Ab Ruby 2.3.0 können Sie den sicheren Navigationsoperator (&.) mit Numeric#nonzero? kombinieren. &. gibt nil zurück, wenn die Instanz nil war, und nonzero? - wenn die Nummer 0 war:

if discount&.nonzero?
  # ...
end

Oder postfix:

do_something if discount&.nonzero?
18
ndnenkov
if (discount||0) != 0
  #...
end
16

Sie könnten das tun:

if (!discount.nil? && !discount.zero?)

Die Reihenfolge ist hier wichtig, denn wenn discountnil ist, hat sie keine zero?-Methode. Rubys Kurzschlussbewertung sollte verhindern, dass discount.zero? ausgewertet wird, wenn discountnil ist.

13
Jeremy Ruten

Sie können Ihre leere Zeile in einen ganzzahligen Wert konvertieren und den Wert Null überprüfen.

"".to_i.zero? => true
nil.to_i.zero? => true
11
oivoodoo
def is_nil_and_zero(data)
     data.blank? || data == 0 
end  

Wenn wir "" übergeben, wird "false" zurückgegeben und "leer". gibt wahr ..__ zurück. Gleiches gilt, wenn data = false leer ist. Gibt true für null, false, empty oder eine Whitespace-Zeichenkette zurück. Methode, um auch leere Zeichenfolge zu vermeiden.

3
Saroj
if discount and discount != 0
  ..
end

update, es wird false für discount = false

3
rubyprince

Sie können die NilClass bereitgestellte #to_i-Methode nutzen, die für nil-Werte Null zurückgibt:

unless discount.to_i.zero?
  # Code here
end

Wenn discount gebrochene Zahlen sein kann, können Sie stattdessen #to_f verwenden, um zu verhindern, dass die Zahl auf Null gerundet wird.

2
Dave G-W

Beim Umgang mit einem Datenbanksatz initialisiere ich gerne alle leeren Werte mit 0 und verwende den Migrationshelfer:

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

Sie können den Rabatt auf 0 initialisieren, solange der Code vor der Initialisierung garantiert nicht verwendet wird. Das würde einen Scheck entfernen, denke ich, mir fällt nichts anderes ein.

0
Ed S.

Alternative Lösung ist die Verwendung von Verfeinerungen wie folgt:

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
0
RichOrElse
if discount.nil? || discount == 0
  [do something]
end