Question Une explication concise de nil v. Vide v. Blank dans Ruby on Rails


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

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

  • nil? Les objets sont des instances de NilClass.

  • empty? Les objets sont spécifiques à la classe et la définition varie d'une classe à l'autre. Une chaîne est vide si elle ne comporte aucun caractère et un tableau est vide s'il ne contient aucun élément.

Y at-il quelque chose qui manque, ou une comparaison plus serrée qui peut être faite?


953
2018-05-19 22:51


origine


Réponses:


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

.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

Fonctionnement .empty? sur quelque chose qui est nul va jeter un NoMethodError.

C'est là où .blank? entre. Il est mis en œuvre par Rails et fonctionnera sur n'importe quel objet ainsi que travailler 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 true sur les chaînes non vides mais contenant uniquement des espaces:

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

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

Array gotcha: blank? reviendra false même si tout éléments d'un tableau sont vides. Pour déterminer le vide dans ce cas, utilisez all? avec blank?, par exemple:

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

1276
2018-05-20 16:14



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

enter image description here


581
2017-12-18 16:29



Il suffit d'étendre la table de Julian:

enter image description here

Ref: vide? vide? nil? 傻傻 分不清楚


173
2017-11-12 00:20



Conseil rapide: !obj.blank? == obj.present?

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


56
2017-07-13 11:33



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


43
2018-05-19 23:42



Un cas particulier est lorsque vous essayez d'évaluer 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?


9
2017-11-14 13:56



Juste une petite note sur le any? recommandation: Il a raison que c'est généralement équivalent à !empty?. cependant, any? reviendra true à une chaîne de juste espaces (ala " ").

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


8
2017-07-13 19:25



enter image description here

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

tl; dr - utiliser seulement blank? & present? sauf si vous voulez faire la distinction entre "" et " "


8
2018-01-15 18:17



Ne pas oublier any? ce qui est généralement !empty?. Dans Rails, je vérifie généralement la présence de quelque chose à la fin d'une déclaration avec if something ou unless something alors utilisez blank? si nécessaire, car il semble fonctionner partout.


7
2018-05-19 23:51



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

b = nil
b.nil? # => true

empty? est une méthode Ruby standard qui peut être appelée sur certains objets tels que Strings, Arrays et Hashes et retourne 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é nil objets.

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


6
2017-12-22 05:41