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?
wenn nicht rabatt.nil? || Rabatt == 0 # ... Ende
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.
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.
Es sei denn, [null, 0] .include? (Rabatt) # ... Ende
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?
if (discount||0) != 0
#...
end
Sie könnten das tun:
if (!discount.nil? && !discount.zero?)
Die Reihenfolge ist hier wichtig, denn wenn discount
nil
ist, hat sie keine zero?
-Methode. Rubys Kurzschlussbewertung sollte verhindern, dass discount.zero?
ausgewertet wird, wenn discount
nil
ist.
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
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.
if discount and discount != 0
..
end
update, es wird false
für discount = false
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.
Beim Umgang mit einem Datenbanksatz initialisiere ich gerne alle leeren Werte mit 0 und verwende den Migrationshelfer:
add_column :products, :price, :integer, default: 0
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.
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
if discount.nil? || discount == 0
[do something]
end