web-dev-qa-db-fra.com

Ruby vérifier si rien avant d'appeler la méthode

J'ai une chaîne dans Ruby sur laquelle j'appelle la méthode strip afin de supprimer les espaces de début et de fin. par exemple.

s = "12345 "
s.strip

Cependant, si la chaîne est vide, j'obtiens l'erreur suivante. 

NoMethodError: méthode non définie `strip 'pour nil: NilClass

J'utilise Ruby 1.9 alors quel est le moyen le plus simple de vérifier si la valeur est nulle avant d'appeler la méthode strip?

Mettre à jour:

J'ai essayé ceci sur un élément d'un tableau mais j'ai eu le même problème:

data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip
34
user1513388

Ruby 2.3.0 a ajouté un opérateur de navigation safe (&.) qui recherche la valeur nil avant d’appeler une méthode.

s&.strip

Il retournera nil si s est nil, plutôt que de lever NoMethodError.

70
user513951

Vous pouvez utiliser la méthode try à partir de ActiveSupport (bibliothèque Rails)

gem install activesupport

require 'active_support/core_ext/object/try'
s.try(:strip)

ou vous pouvez utiliser ma gemme tryit qui donne des facilités supplémentaires:

gem install tryit

s.try { strip }
14
megas

Si la création d'objet supplémentaire ne vous dérange pas, l'une ou l'autre de ces tâches fonctionne:

"#{s}".strip
s.to_s.strip

Sans objet supplémentaire:

s && s.strip
s.strip if s
8
Michael Kohl

Je suppose que la méthode la plus simple serait la suivante:

s.strip if s
5
lukad

ActiveSupport vient avec une méthode pour cela: try. Par exemple, an_object.try :strip retournera nil si an_object est nul, mais procédera autrement. La syntaxe est la même que send. Cf active_support_core_extensions.html # try .

2
ksol

Si vous voulez éviter l'erreur qui apparaît dans la question:

s.to_s.strip
1
sawa

Tout simplement:

s = s.nil? ? s : s.strip

Tl; dr Vérifiez si s est nul, puis retournez s, sinon, supprimez-le.

0
Eugene