web-dev-qa-db-fra.com

Une explication concise de nil v. Empty v. Blank dans Ruby sur Rails

Je me trouve à plusieurs reprises à la recherche d'une définition claire des différences entre nil?, blank? et empty? dans Ruby sur Rails. Voici le plus proche que je suis venu:

  • Les objets blank? sont faux, vides ou une chaîne d'espacement. Par exemple, "", " ", nil, [] et {} sont vides.

  • Les objets nil? sont des instances de NilClass.

  • Les objets empty? sont spécifiques à une classe et leur définition varie d'une classe à l'autre. Une chaîne est vide si elle ne contient pas de caractères et un tableau est vide si elle ne contient aucun élément.

Y a-t-il quelque chose qui manque ou une comparaison plus étroite qui peut être faite?

1075
Arrel

.nil? peut être utilisé sur n'importe quel objet et vaut true si l'objet est nil.

.empty? peut être utilisé sur des chaînes, des tableaux et des hachages et renvoie true si:

  • Longueur de la chaîne == 0
  • Longueur du tableau == 0
  • Longueur de hachage == 0

Si vous exécutez .empty? sur quelque chose qui est nul, une NoMethodError sera lancée.

C’est là que .blank? entre en jeu. Il est mis en œuvre par Rails et fonctionnera sur n’importe quel objet et fonctionnera comme .empty? sur les chaînes, les tableaux et les hachages.

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

.blank? évalue également la valeur true sur les chaînes non vides mais ne contenant que des espaces:

"  ".blank? == true
"  ".empty? == false

Rails fournit également.present?, qui renvoie la négation de .blank?.

Le tableau gotcha: blank? retournera false même si tous les éléments d'un tableau sont vides. Pour déterminer le blanc dans ce cas, utilisez all? avec blank?, par exemple:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
1383
Corban Brook

J'ai fait ce tableau utile avec tous les cas:

enter image description here

blank?, present? sont fournis par Rails.

650
Julian Popov

Il suffit d'étendre la table de Julian:

enter image description here

Ref: vide? Vide? Nil? 傻傻 分不清楚

204
Sibevin Wang

Petit conseil: !obj.blank? == obj.present?

Peut être pratique/plus facile pour les yeux dans certaines expressions

59
Alexander Malfait

Une différence est que .nil? et .empty? sont des méthodes fournies par le langage de programmation Ruby, alors que .blank? est quelque chose ajouté par le framework de développement Web Rails.

48
Andrew Grimm

enter image description here

  • Tout ce qui est nil? est blank?
  • Tout ce qui est empty? est blank?
  • Rien de ce qui est empty? est nil?
  • Rien de ce qui est nil? est empty?

tl; dr - utilise uniquement blank? & present? sauf si vous souhaitez faire la distinction entre "" et " "

33
steve

Un cas particulier concerne l’essai de déterminer si une valeur booléenne est nulle:

false.present? == false
false.blank? == true
false.nil? == false

Dans ce cas, la recommandation serait d'utiliser .nil?

13
Alan H

Juste une petite remarque sur la recommandation any?: Il a raison de dire que c'est généralement équivalent à !empty?. Cependant, any? renverra true en une chaîne d’espace vierge (ala " ").

Et bien sûr, voir le commentaire 1.9 ci-dessus aussi.

11
davemyron

N'oubliez pas any? qui est généralement !empty?. Dans Rails, je vérifie généralement la présence de quelque chose à la fin d'une instruction avec if something ou unless something, puis utilise blank? là où cela est nécessaire, car cela semble fonctionner partout.

10
Andy

nil? est une méthode standard Ruby qui peut être appelée sur tous les objets et renvoie true si l'objet est nil:

b = nil
b.nil? # => true

empty? est une méthode standard Ruby qui peut être appelée sur certains objets tels que Strings, Arrays et Hashs et renvoie true si ces objets ne contiennent aucun élément:

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false

empty? ne peut pas être appelé sur des objets nil.

blank? est une méthode Rails qui peut être appelée sur les objets nil ainsi que sur les objets vides.

9
neha

Tout le monde a bien expliqué quelle est la différence.

Je voudrais ajouter dans Ruby sur Rails, il est préférable d’utiliser obj.blank? ou obj.present? au lieu de obj.nil? ou obj.empty?.

obj.blank? gère tous les types nil, '', [], {} et renvoie true si les valeurs ne sont pas disponibles et renvoie false si les valeurs sont disponibles pour tout type d'objet.

4

La méthode exists? peut être utilisée pour vérifier si les données existent ou non dans la base de données. Il retourne des valeurs booléennes soit true ou false.

3
kelvin

Rails 4

une alternative à @ corban-brook '' Array gotcha: blank? ' pour vérifier si un tableau ne contient que des valeurs vides et peut être considéré comme vierge? vrai:

[ nil, '' ].all? &:blank? == true

on pourrait aussi faire:

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true
2
mahatmanich

nil? peut être utilisé sur n'importe quel objet. Il détermine si l'objet a une valeur ou non, y compris les valeurs "vides".

Par exemple:

example = nil
example.nil?  # true

"".nil?  # false

Fondamentalement, nil? ne retournera jamais vrai que si l'objet est en fait égal à 'nul'.

empty? est uniquement appelé pour les objets considérés comme une collection. Cela inclut des éléments tels que des chaînes (une collection de caractères), des hachages (une collection de paires clé/valeur) et des tableaux (une collection d'objets arbitraires). empty? renvoie true s'il n'y a aucun élément dans la collection.

Par exemple:

"".empty? # true
"hi".empty?   # false
{}.empty?  # true
{"" => ""}.empty?   # false
[].empty?   # true
[nil].empty?  # false

nil.empty?  # NoMethodError: undefined method `empty?' for nil:NilClass

Notez que empty? ne peut pas être appelé sur des objets nil, car les objets nil ne sont pas une collection et une exception sera levée.

Notez également que même si les éléments d'une collection sont vides, cela ne signifie pas qu'une collection est vide.

blank? est essentiellement une combinaison de nil? et empty? Il est utile pour vérifier les objets que vous supposez être des collections, mais qui pourraient également être nuls.

1
Chitra