Explication concise de nil v. empty v. blank dans Ruby on Rails

je cherche à plusieurs reprises une définition claire des différences de nil? , blank? , et empty? dans Ruby on Rails. Voici ce que j'ai de plus proche:

  • blank? les objets sont des chaînes false, empty ou whitespace. Par exemple, "" , " " , nil , [] , et {} sont vides.

  • nil? les objets sont exemples de NilClass.

  • empty? les objets sont propres à une classe, et la définition varie d'une classe à l'autre. Une chaîne est vide, s'il n'a pas de caractères, et un tableau est vide si elle ne contient pas les éléments.

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

982
demandé sur Jonathan Leffler 2009-05-20 02:51:36

14 réponses

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

.empty? peut être utilisé sur les chaînes, les tableaux et les hachures et retourne true si:

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

courir .empty? sur quelque chose qui est nul lancera un NoMethodError .

que est là .blank? . Il est mis en œuvre par les Rails et fonctionnera sur tout objet ainsi que le travail comme .empty? sur les chaînes, les tableaux et les hachures.

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

.blank? évalue également true sur des chaînes 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? .

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

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
1300
répondu Corban Brook 2015-10-06 11:39:24

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

enter image description here

blank? , present? sont fournis par les Rails.

596
répondu Julian Popov 2018-08-12 16:19:17

Juste étendre Julian table:

enter image description here

Ref: empty?vide?nul?HIPC HIPC

179
répondu Sibevin Wang 2016-09-04 14:09:37

astuce: !obj.blank? == obj.present?

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

56
répondu Alexander Malfait 2010-07-13 11:33:23

une différence est que .nil? et .empty? sont des méthodes qui sont fournies par le langage de programmation Ruby, tandis que .blank? est quelque chose ajouté par les Rails du cadre de développement web.

43
répondu Andrew Grimm 2012-11-14 14:53:41

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 -- utilisez uniquement blank? & present? sauf si vous voulez pour distinguer entre "" et " "

11
répondu steve 2018-01-15 18:17:51

un cas particulier est lorsque l'on essaie 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?

10
répondu Alan H 2012-11-14 13:56:02

juste une petite note à propos de la recommandation any? : il a raison que c'est généralement équivalent à !empty? . Cependant, any? retournera true à une chaîne de juste espace (ala " " ).

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

8
répondu davemyron 2009-07-13 19:25:16

N'oubliez pas any? qui est généralement !empty? . Dans les 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 puis utiliser blank? où nécessaire car il semble fonctionner partout.

7
répondu 2009-05-19 23:51:50

nil? est une méthode Ruby standard 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 Ruby standard qui peut être appelée sur certains objets tels que des chaînes, des tableaux et des hachures 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 les objets nil .

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

6
répondu neha 2016-01-29 18:27:21

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

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

obj.blank? poignées tous les types nil , '' , [] , {} , et retourne true si les valeurs ne sont pas disponibles et retourne false si les valeurs sont disponibles sur n'importe quel type d'objet.

2
répondu Manish Shrivastava 2016-01-29 18:25:33
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 renvoie les valeurs booléennes true ou false .

2
répondu kelvin 2016-02-18 19:05:37

Rails 4

une alternative au tableau de @corban-brook 'Gotcha: blank? pour vérifier si un tableau ne contient que des valeurs vides et peut être considéré comme vide? vrai:

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

on pourrait aussi faire:

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true
1
répondu mahatmanich 2015-08-19 13:52:27

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

par exemple:

example = nil
example.nil?  # true

"".nil?  # false

en gros nil? ne jamais retourner true si l'objet est en fait égal à 'nil'.

empty? s'applique uniquement aux objets qui sont considérés comme une collection. Cela inclut des choses comme des chaînes (une collection de caractères), des hachures (une collection de paires clé/valeur) et des tableaux (une collection d'objets arbitraires). empty? renvoie true s'il n'y a pas d'éléments 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

avis que empty? ne peut pas être appelé sur les objets nuls car les objets nuls ne sont pas une collection et il soulèvera une exception.

aussi noter que même si les articles dans une collection sont Vierges, 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 pourrait également être nul.

0
répondu Chitra 2016-01-29 18:23:46