1186 votes

Comment comprendre les termes "nil", "empty" et "blank" en Ruby ?

Je me retrouve sans cesse à la recherche d'une définition claire des différences entre nil? , blank? et empty? en Ruby on Rails. Voici ce que j'ai trouvé de plus proche :

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

  • nil? sont des instances de NilClass.

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

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

30 votes

Un problème est qu'un tableau vide renvoie false pour present? . C'est parce que blank? retourne vrai pour un tableau vide.

4 votes

Une bonne chose est de voir que :nil? est défini sur ::Kernel et remplacée par ::NilClass alors que :empty? est implémenté séparément sur de nombreuses classes (nativement sur ::String , ::Array , ::Hash et de manière non négative sur d'autres classes telles que ::Set de stdlib et ::ActiveRecord::Relation des rails). Donc :nil? est disponible dans toutes les sous-classes de ::Object et aussi dans chaque classe qui comprend ::Kernel par lui-même, où :empty? doivent être implémentées ou incluses spécifiquement dans vos classes.

0 votes

Si vous essayez de comprendre l'ensemble nil concept commencer ici .

1478voto

Corban Brook Points 8836

.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 vrai si :

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

Running .empty? sur quelque chose qui est nil lancera un NoMethodError .

C'est là que .blank? entre en jeu. Il s'agit mis en œuvre par Rails et opérera sur n'importe quel objet ainsi que sur des travaux tels que .empty? sur les chaînes de caractères, 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 vrai sur les chaînes de caractères qui ne sont pas vides mais qui ne contiennent que des espaces :

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

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

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

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

27 votes

Comme indiqué dans la question, certaines chaînes de caractères non vides sont considérées comme des blancs.

1 votes

Pourquoi n'ont-ils pas écrasé le .empty de Nil s'ils pouvaient ajouter .blank ?

7 votes

Aussi : false.blank? == true

698voto

ju. Points 3497

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

enter image description here

blank? , present? sont fournis par Rails.

57 votes

Il convient de noter que blank ? et present ? sont réservés aux rails. Ils renvoient Exception : NoMethodError en Ruby 2.0.0.

17 votes

Envisagez d'ajouter any? si jamais vous mettez à jour la table.

0 votes

blank? y present? ne sont pas " Rails uniquement ", ils sont automatiquement inclus par Rails mais peuvent facilement être inclus dans du code non-Rails en utilisant les extensions Core d'ActiveSupport. Voir stackoverflow.com/questions/4238867/

65voto

Alexander Malfait Points 1920

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

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

0 votes

Existe-t-il un équivalent de !obj.nil ?

0 votes

present? fait partie de Active_support, vérifiez ici ce qu'il faut inclure pour l'obtenir : stackoverflow.com/a/4648704/1569

2 votes

@Kirk : !!obj est équivalent à !obj.nil ?

55voto

Andrew Grimm Points 22996

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

15voto

orangechicken Points 1049

Juste une petite note à propos du any? recommandation : Il a raison de dire que c'est généralement équivalent à !empty? . Cependant, any? retournera true à une chaîne de caractères composée uniquement d'espaces (ala " " ).

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

0 votes

Dans Rails, toute chaîne ne contenant que des caractères d'espacement est "vide" : " \n\r\t ".blank ? #=> vrai

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X