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?
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
j'ai fait ce tableau utile avec tous les cas:
blank?
, present?
sont fournis par les Rails.
astuce: !obj.blank? == obj.present?
peut être pratique / plus facile sur les yeux dans certaines expressions
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.
- Tout ce qui est
nil?
estblank?
- "Tout ce qui est
empty?
estblank?
- rien de ce qui est
empty?
estnil?
- rien de ce qui est
nil?
estempty?
tl;dr -- utilisez uniquement blank?
& present?
sauf si vous voulez pour distinguer entre ""
et " "
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?
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.
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.
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.
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
.
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
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.