Je me retrouve à plusieurs reprises à la recherche d'une définition claire des différences de nil?
, blank?
et empty?
en 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 n'a pas de caractères et un tableau est vide s'il ne contient aucun élément.
Y a-t-il quelque chose qui manque ou une comparaison plus étroite qui peut être faite?
ruby-on-rails
ruby
Arrel
la source
la source
present?
. En effet,blank?
renvoie true pour un tableau vide.:nil?
est défini sur::Kernel
et réécrite sur::NilClass
, tout:empty?
est mis en œuvre séparément sur de nombreuses classes ( en mode natif sur::String
,::Array
,::Hash
et non en mode natif sur d' autres classes comme::Set
de stdlib et::ActiveRecord::Relation
de rails). Donc,:nil?
est disponible dans toutes les sous-classes de::Object
et aussi dans chaque classe qui comprend::Kernel
par elle-même, où:empty?
doit être implémentée ou incluse spécifiquement dans vos classes.nil
concept, commencez ici .[1] pry(main)> [].blank? => true
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:Courir
.empty?
sur quelque chose de nul jettera aNoMethodError
.C'est là
.blank?
qu'intervient. Il est implémenté par Rails et fonctionnera sur n'importe quel objet ainsi que.empty?
sur des chaînes, des tableaux et des hachages..blank?
évalue également true sur les chaînes qui ne sont pas vides mais ne contiennent que des espaces:Rails fournit également
.present?
, qui renvoie la négation de.blank?
.Array gotcha:
blank?
retournerafalse
même si tous les éléments d'un tableau sont vides. Pour déterminer le vide dans ce cas, utilisezall?
avecblank?
, par exemple:la source
false.blank? == true
presence
!J'ai fait ce tableau utile avec tous les cas:
blank?
,present?
sont fournis par Rails.la source
any?
si vous mettez à jour le tableau.blank?
etpresent?
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/…Il suffit d'étendre la table de Julian:
Réf: vide? Vide? Nul? 傻傻 分不清楚
la source
Enumerable#any?
est vanilla Ruby, il ne devrait pas être répertorié sous "rails uniquement".zero?
et.nonzero?
Conseil rapide:
!obj.blank? == obj.present?
Peut être pratique / plus agréable pour les yeux dans certaines expressions
la source
present?
fait partie de active_support, vérifiez ici ce qu'il faut inclure pour l'obtenir: stackoverflow.com/a/4648704/1569!!false
Une différence est que
.nil?
et.empty?
sont des méthodes qui sont fournis par le langage de programmation Ruby, alors.blank?
quelque chose ajoutée par le cadre de développement web Rails.la source
nil?
estblank?
empty?
estblank?
empty?
estnil?
nil?
estempty?
tl; dr - utilisez uniquement
blank?
&present?
sauf si vous voulez faire la distinction entre""
et" "
la source
Un cas particulier consiste à évaluer si une valeur booléenne est nulle:
Dans ce cas, la recommandation serait d'utiliser
.nil?
la source
Juste une petite note au sujet de la
any?
recommandation: Il a raison de dire qu'elle est généralement équivalente à!empty?
. Cependant,any?
reviendratrue
à une chaîne de simples espaces (ala" "
).Et bien sûr, voir aussi le commentaire 1.9 ci-dessus.
la source
N'oubliez pas
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 avecif something
ouunless something
ensuite j'utiliseblank?
où cela est nécessaire car il semble fonctionner partout.la source
any?
à vérifier le non-vide. Il renvoie false si vous avez un tableau de valeurs de falsification. Un moyen de contourner cela est de passer un bloc toujours vrai:,[nil, false].any?{ true }
mais!empty?
est plus court et vous ne vous souvenez pas du comportement étrange.nil?
est une méthode Ruby standard qui peut être appelée sur tous les objets et renvoietrue
si l'objet estnil
:empty?
est une méthode Ruby standard qui peut être appelée sur certains objets tels que Strings, Arrays et Hashes et renvoietrue
si ces objets ne contiennent aucun élément:empty?
ne peut pas être appelé sur desnil
objets.blank?
est une méthode Rails qui peut être appeléenil
aussi bien sur des objets que sur des objets vides.la source
Tout le monde a bien expliqué quelle est la différence.
Je voudrais ajouter Ruby On Rails, il vaut mieux utiliser
obj.blank?
ou à laobj.present?
place deobj.nil?
ouobj.empty?
.obj.blank?
gère tous les typesnil
,''
,[]
,{}
et retournetrue
si les valeurs ne sont pas disponibles et les rendementsfalse
si les valeurs sont disponibles sur tout type d'objet.la source
exists?
peut être utilisée pour vérifier si les données existent ou non dans la base de données. Il renvoie des valeurs booléennes soittrue
oufalse
.la source
Rails 4
une alternative à 'Array gotcha: blank?' de @ corban-brook pour vérifier si un tableau ne contient que des valeurs vides et peut être considéré comme vide? vrai:
on pourrait aussi faire:
la source
nil?
peut être utilisé sur n'importe quel objet. Il détermine si l'objet a une valeur ou non, y compris des valeurs «vides».Par exemple:
Fondamentalement
nil?
, ne retournera vrai que si l'objet est en fait égal à «néant».empty?
est uniquement appelé sur les objets considérés comme une collection. Cela inclut des choses comme 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:
Notez qu'il
empty?
ne peut pas être appelé sur des objets nil car les objets nil ne sont pas une collection et cela déclenchera une exception.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 denil?
etempty?
il est utile pour vérifier les objets que vous supposez être des collections, mais qui peuvent également être nuls.la source