Est-il mauvais de vérifier si un tableau n'est pas vide en utilisant la any?
méthode?
a = [1,2,3]
a.any?
=> true
a.clear
a.any?
=> false
Ou vaut-il mieux l'utiliser unless a.empty?
?
any?
n'est pas la même que not empty?
dans certains cas.
>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
De la documentation:
Si le bloc n'est pas donné, Ruby ajoute un bloc implicite de {| obj | obj} (c'est-à-dire any? retournera true si au moins un des membres de la collection n'est pas faux ou nul).
empty?
?present?
méthode.#present?
est uniquement Rails. En pur Ruby, vous obtiendrezNoMethodError: undefined method 'present?' for Array
.require 'activesupport'
.La différence entre un tableau évaluant ses valeurs
true
ou s'il est vide.La méthode
empty?
provient de la classe Arrayhttp://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F
Il est utilisé pour vérifier si le tableau contient quelque chose ou non. Cela inclut les éléments qui évaluent
false
, tels quenil
etfalse
.La méthode
any?
provient du module Enumerable.http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
Il est utilisé pour évaluer si "une" valeur du tableau est évaluée à
true
. Des méthodes similaires à celle-ci sontnone?
,all?
etone?
, où elles vérifient toutes simplement combien de fois true pourrait être évalué. ce qui n'a rien à voir avec le nombre de valeurs trouvées dans un tableau.cas 1
cas 2
cas 3
la source
Le préfixe de l'instruction avec un point d'exclamation vous permettra de savoir si le tableau n'est pas vide. Donc dans votre cas -
la source
Évitez les
any?
grands tableaux.any?
estO(n)
empty?
estO(1)
any?
ne vérifie pas la longueur mais scanne en fait l'ensemble du tableau pour les éléments de vérité.empty?
d'autre part vérifie uniquement la longueur du tableau.La différence est pertinente si vous avez des tableaux "épars" qui commencent par beaucoup de
nil
valeurs, comme par exemple un tableau qui vient d'être créé.la source
nil
valeurs, avec des tableaux "normaux"any?
sans retour de bloc au premier élément, donc la complexité est toujours O (1) comme laempty?
méthodeJe vous suggère d'utiliser
unless
etblank
de vérifier est vide ou non.Exemple :
Cela saura «un» vide ou non. Si «a» est vide, le code ci-dessous ne fonctionnera pas.
la source
#blank?
fait partie de Rails. S'ils utilisent déjà Rails,#present?
c'est la négation de#blank?
toute façon.Je ne pense pas que ce soit mauvais à utiliser
any?
du tout. Je l'utilise beaucoup. C'est clair et concis.Cependant, si vous êtes préoccupé par toutes les
nil
valeurs qui le jettent, vous demandez vraiment si le tableau asize > 0
. Dans ce cas, cette extension simple morte (PAS optimisée, style singe) vous rapprocherait.C'est assez descriptif, demandant logiquement "cet objet a-t-il une taille?". Et c'est concis, et cela ne nécessite pas ActiveSupport. Et c'est facile à construire.
Quelques extras auxquels réfléchir:
present?
depuis ActiveSupport.String
, qui ignore les espaces (comme lepresent?
fait).length?
pourString
ou d'autres types où il pourrait être plus descriptif.Integer
et d'autresNumeric
types, de sorte qu'un zéro logique retournefalse
.la source