web-dev-qa-db-fra.com

Vérifier si une variable n'est ni nulle ni nulle en ruby

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?

224
hectorsq
 sauf remise.nil? || remise == 0 
 # ...
fin
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

Méfiez-vous des dénis de responsabilité habituels ... grand pouvoir/responsabilité, patch de singe conduisant au côté obscur, etc.

39
madlep

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.

26
rewritten
 à moins que [nul, 0] .include? (remise) 
 # ...
fin
25
Dejan Simic

À 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?
18
ndnenkov
if (discount||0) != 0
  #...
end
16

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.

13
Jeremy Ruten

Vous pouvez convertir votre ligne vide en valeur entière et vérifier zéro?.

"".to_i.zero? => true
nil.to_i.zero? => true
11
oivoodoo
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.

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

mettre à jour, false pour discount = false

3
rubyprince

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.

2
Dave G-W

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
1
pastullo

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.

0
Ed S.

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