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?
.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:
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
J'ai fait ce tableau utile avec tous les cas:
blank?
, present?
sont fournis par Rails.
Petit conseil: !obj.blank? == obj.present?
Peut être pratique/plus facile pour les yeux dans certaines expressions
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.
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?
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.
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.
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.
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.
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
.
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
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.