2017-05-22 3 views
0

Je pensais quePourquoi Ruby me dit-elle qu'elle est présente? est faux quand une valeur est là?

arg.present? 

était la vérité et la lumière afin de vérifier si une chaîne est vide ou nul, mais je remarque un cas de confusion. Si ma chaîne est:

arg = "\t" 

je reçois un mauvais résultat:

2.4.0 :003 > arg = "\t" 
=> "\t" 
2.4.0 :004 > arg.present? 
=> false 

Quelle est une façon plus à toute épreuve pour vérifier si mon argument de chaîne est vide ou nul? Bien sûr, je pourrais écrire arg.empty? || arg.nil? mais je cherchais un moyen plus concis.

+1

Est-ce que 'to_s.empty?' Fonctionnera? –

Répondre

7

Donc #present? est l'opposé de #blank?, et #blank? est défini comme "Un objet est vide s'il est faux, vide, ou une chaîne d'espaces".

« \ t » est une chaîne des espaces (un onglet), et il est donc #blank?, et ce n'est pas #present?

Notez que « \ t » n'interprété comme un onglet en raison de la façon dont la chaîne a été construit.

2.2.5 :001 > "\t".present? 
=> false 
2.2.5 :002 > '\t'.present? 
=> true 
+0

"Notez que" \ t "n'est interprété que comme un onglet en raison de la façon dont la chaîne a été construite." "a été construit"? Les caractères échappés sont ignorés avec une guillemets simples et honorés avec des guillemets: http://ruby-doc.org/core-2.4.1/doc/syntax/literals_rdoc.html#label-Strings –

-1

Je vous recommande la lecture et peut-être jouer avec les exemples Active Support's Core documentation.

Cela pourrait aider à expliquer:

require 'active_support/core_ext/object/blank' 

empty_str = '' 
tab = "\t" 
period = '.' 

empty_str.empty? # => true 
empty_str.present? # => false 
empty_str.blank? # => true 

Une chaîne vide est empty?, il n'a pas de valeur (ou contenu) donc il n'y a rien à present?, et il est blank? parce qu'il est empty?.

tab.empty? # => false 
tab.present? # => false 
tab.blank? # => true 

tab n'est pas empty? parce qu'il a un contenu, mais il est des espaces il est donc pas present? et il est blank?.

period.empty? # => false 
period.present? # => true 
period.blank? # => false 

period n'est pas empty? ou blank? parce que ce n'est pas des espaces, mais il est present?.