it-swarm.com.de

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