web-dev-qa-db-fra.com

Ruby pour vérifier si une chaîne n'est pas vide?

Quelle est la meilleure façon de vérifier si une variable n'est pas vide dans une autre condition si Ruby (pas Rails)?

elsif not variable.to_s.empty?
  # do something
end

ou 

elsif !variable.to_s.empty?
  # do something
end

ou

elsif variable.to_s.length > 0
  # do something
end
22
Rajkaran Mishra
string = ""

unless string.to_s.strip.empty?
  # ...
end
29
Lukas Baliak

Vous pouvez utiliser soit

unless var.empty?
  #do sth
end

ou

unless var == ""
  #do sth
end

ou tous avec if et un negator !

4
three

Je viens de découvrir que ''.empty? renvoie true mais ' '.empty? renvoie false. Même to_s.length pour ' ' n'est pas nul.

Peut-être qu'il est préférable d'utiliser strip comme ' '.strip.empty? 

2
RamanSM

La source de la méthode empty? est analogue à celle-ci:

def empty?
    return length == 0      
end 

Donc, vous pouvez utiliser en toute sécurité

any_string.length != 0

Quoi qu'il en soit, en utilisant ce code dans un autre if si est un peu prolixe, je vous encourage à définir la méthode present? dans la classe String.

class String
    def present?
        !empty?
    end
end

Vous pouvez maintenant écrire votre code de la manière suivante:

if some_condition
  # do something
elsif variable.to_s.present?
  # do something else
end

De cette façon, vous obtenez un code clair, sans utiliser negations ou unless qui sont difficiles à lire.

Bien sûr, il y a un problème ici, j'ai pris le nom present? (et la méthode) de Rails. present? renvoie true si l'objet n'est pas vide, mais les chaînes avec des tabulations ou des espaces (caractères blancs) sont considérées comme des blancs. Donc, ce present? retournera true pour les chaînes suivantes:

"".present?       # => false
"   ".present?    # => true
"\t\n\r".present? # => true
" blah ".present? # => true

Cela dépend de ce que vous voulez, il y a de fortes chances que vous souhaitiez être vrai pour les 3 premières chaînes et faux pour les plus récentes. Vous pouvez utiliser l'approche @RamanSM et utiliser strip pour éviter les espaces vides

class String
    def present?
        !strip.empty?
    end
end

maintenant, present? renvoie false pour les chaînes avec des espaces blancs

"".present?       # => false
"   ".present?    # => false
"\t\n\r".present? # => false
" blah ".present? # => true
0
lcjury