83 votes

Le meilleur idiome ruby pour "nil or zero".

Je cherche un moyen concis de vérifier une valeur pour voir si elle est nulle ou zéro. Actuellement, je fais quelque chose comme :

if (!val || val == 0)
  # Is nil or zero
end

Mais cela semble très maladroit.

1 votes

Que se passe-t-il si val est égal à false ?

72voto

Christian Lescuyer Points 8656

Les objets ont un Nul ? méthode .

if val.nil? || val == 0
  [do something]
end

Ou, pour une seule instruction :

[do something] if val.nil? || val == 0

5 votes

Attention à l'utilisation de "or" et "and", qui ont une priorité différente et très faible par rapport à || et &&. Voir blog.jayfields.com/2007/08/ pour quelques remarques.

0 votes

Je suis d'accord avec certains posteurs sur l'"odeur" de la question, mais pour moi, c'est plutôt la manière ruby.

6 votes

La préséance de or ne nécessite pas de parenthèses ici, et sera lu tout naturellement par un Rubyiste expérimenté. Les seules personnes qui se font piquer par || contre or sont des personnes qui n'ont jamais programmé Perl :)

38voto

Si vous aimez vraiment les noms de méthodes avec des points d'interrogation à la fin :

if val.nil? || val.zero?
  # do stuff
end

Votre solution est bonne, comme le sont quelques-unes des autres solutions.

Ruby peut vous faire chercher une jolie façon de tout faire, si vous ne faites pas attention.

37voto

ndn Points 15391

À partir de Ruby 2.3.0, vous pouvez combiner l'opérateur de navigation sûre ( &. ) avec Numeric#nonzero? . &. renvoie à nil si l'instance était nil y nonzero? - si le numéro était 0 :

unless val&.nonzero?
  # Is nil or zero
end

Ou postfix :

do_something unless val&.nonzero?

30voto

Mike Deck Points 7443

Tout d'abord, je pense que c'est la façon la plus concise de vérifier cette condition particulière.

Deuxièmement, pour moi, il s'agit d'une odeur de code qui indique un défaut potentiel dans votre conception. En général, nil et zéro ne devraient pas signifier la même chose. Si possible, vous devriez essayer d'éliminer la possibilité que val soit nil avant de faire ce code, soit en le vérifiant au début de la méthode, soit par un autre mécanisme.

Vous pouvez avoir une raison parfaitement légitime de faire cela, auquel cas je pense que votre code est bon, mais j'envisagerais au moins de me débarrasser de la vérification de nil si possible.

4 votes

Vous avez raison pour l'odeur du code ! +1 Je pourrais envisager d'examiner le modèle NullObject. fr.wikipedia.org/wiki/Null_Object_pattern

9voto

Adrian Dunston Points 2115

Vous pouvez utiliser la fonction Object.nil ? pour tester spécifiquement la présence de nil (et ne pas être pris entre false et nil). Vous pouvez également intégrer une méthode dans Object.

class Object
   def nil_or_zero?
     return (self.nil? or self == 0)
   end
end

my_object = MyClass.new
my_object.nil_or_zero?
==> false

Ce n'est pas recommandé car les modifications apportées à l'objet sont difficiles à retracer pour les collègues et peuvent rendre votre code imprévisible pour les autres.

0 votes

Je modifierais la classe Numeric plutôt que Object.

6 votes

Epochwolf, si vous mettez cela sur la classe Numeric, alors nil? retournerait toujours faux. nil? ne renvoie que vrai sur la NilClass.

0 votes

Vous pouvez implémenter la méthode dans Object , NilClass y Numeric . Object rendrait false , NilClass rendrait true y Numeric rendrait zero? .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X