J'utilise le code suivant pour vérifier si une variable n'est ni nulle ni nulle
if(discount != nil && discount != 0)
...
end
Y a-t-il une meilleure manière de faire cela?
sauf remise.nil? || remise == 0 # ... fin
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
Méfiez-vous des dénis de responsabilité habituels ... grand pouvoir/responsabilité, patch de singe conduisant au côté obscur, etc.
ok, après 5 ans passés ....
if discount.try :nonzero?
...
end
Il est important de noter que try
est défini dans la gem ActiveSupport, de sorte qu'il n'est pas disponible en plain Ruby.
à moins que [nul, 0] .include? (remise) # ... fin
À partir de Ruby 2.3.0, vous pouvez combiner l'opérateur de navigation sécurisée (&.
) avec Numeric#nonzero?
. &.
renvoie nil
si l'instance était nil
et nonzero?
- si le nombre était 0
:
if discount&.nonzero?
# ...
end
Ou postfix:
do_something if discount&.nonzero?
if (discount||0) != 0
#...
end
Vous pourriez faire ceci:
if (!discount.nil? && !discount.zero?)
L'ordre est important ici, car si discount
est nil
, alors il n'aura pas de méthode zero?
. L'évaluation de court-circuit de Ruby devrait l'empêcher d'essayer d'évaluer discount.zero?
; toutefois, si discount
est nil
.
Vous pouvez convertir votre ligne vide en valeur entière et vérifier zéro?.
"".to_i.zero? => true
nil.to_i.zero? => true
def is_nil_and_zero(data)
data.blank? || data == 0
end
Si nous passons "" cela retournera faux alors que blanc? renvoie true . Même est le cas lorsque data = false vierge? renvoie true pour les chaînes nil, false, empty ou une chaîne d'espacement . Il est donc préférable d'utiliser un blanc? méthode pour éviter la chaîne vide aussi.
if discount and discount != 0
..
end
mettre à jour, false
pour discount = false
Vous pouvez tirer parti de la méthode NilClass
fournie #to_i
, qui renvoie zéro pour les valeurs nil
:
unless discount.to_i.zero?
# Code here
end
Si discount
peut être un nombre fractionnaire, vous pouvez utiliser #to_f
pour éviter que le nombre ne soit arrondi à zéro.
Lorsque je traite un enregistrement de base de données , j'aime initialiser toutes les valeurs vides avec 0, à l'aide de l'aide de migration:
add_column :products, :price, :integer, default: 0
Vous pouvez initialiser la remise à 0 tant que votre code est garanti de ne pas essayer de l’utiliser avant son initialisation. Cela supprime un chèque, je suppose, je ne peux penser à rien d’autre.
La solution alternative consiste à utiliser les raffinements, comme suit:
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