Je n'arrive pas à trouver de réponse définitive à ce sujet et je veux m'assurer de bien comprendre cela au "nième niveau" :-)
a = {"a" => "Bonjour", "b" => "Monde"} compte n ° 2 a. taille # 2 a.longueur # 2 a = [10, 20] compte n ° 2 a. taille # 2 a.longueur # 2
Alors, lequel utiliser? Si je veux savoir si a a plus d'un élément, cela ne semble pas avoir d'importance, mais je veux m'assurer de bien comprendre la vraie différence. Cela s'applique également aux tableaux. J'ai les mêmes résultats.
De plus, je me rends compte que nombre / taille / longueur ont des significations différentes avec ActiveRecord. Je suis surtout intéressé par le pur Ruby (1.92) en ce moment, mais si quelqu'un veut faire la différence avec l'AR, cela serait également apprécié.
Merci!
ruby
activerecord
size
content-length
cbmeeks
la source
la source
Array#nitems
qui renvoie le nombre d'éléments non NIL dans un tableau. Mais ce n'est plus disponible dans Ruby 1.9Réponses:
Pour les tableaux et les hachages
size
est un alias pourlength
. Ce sont des synonymes et font exactement la même chose.count
est plus polyvalent - il peut prendre un élément ou un prédicat et ne compter que les éléments qui correspondent.Dans le cas où vous ne fournissez pas de paramètre pour compter, cela a fondamentalement le même effet que la longueur d'appel. Il peut cependant y avoir une différence de performance.
Nous pouvons voir dans le code source de Array qu'ils font presque exactement la même chose. Voici le code C pour l'implémentation de
array.length
:Et voici la partie pertinente de la mise en œuvre de
array.count
:Le code
array.count
fait quelques vérifications supplémentaires mais à la fin appelle exactement le même code:LONG2NUM(RARRAY_LEN(ary))
.Les hachages ( code source ) par contre ne semblent pas implémenter leur propre version optimisée de,
count
donc l'implémentation deEnumerable
( code source ) est utilisée, qui itère sur tous les éléments et les compte un par un.En général, je conseillerais d'utiliser
length
(ou son aliassize
) plutôt quecount
si vous voulez savoir combien d'éléments il y a au total.En ce qui concerne ActiveRecord, en revanche, il existe des différences importantes. consultez ce post:
la source
Il existe une différence cruciale pour les applications qui utilisent des connexions de base de données.
Lorsque vous utilisez de nombreux ORM (ActiveRecord, DataMapper, etc.), la compréhension générale est que .size va générer une requête qui demande tous les éléments de la base de données ('select * from mytable') et vous donne ensuite le nombre d'éléments résultant, alors que .count générera une seule requête ('select count (*) from mytable') qui est considérablement plus rapide.
Parce que ces ORM sont si répandus, je suis le principe du moindre étonnement. En général, si j'ai déjà quelque chose en mémoire, j'utilise .size, et si mon code va générer une requête vers une base de données (ou un service externe via une API), j'utilise .count.
la source
counter_cache
. Si vous avez une table,foo
et qu'elle en a beaucoupbar
, vous aurez une colonne dansfoo
namedbars_count
qui sera mise à jour à chaque fois qu'unebar
est créée / détruite. L'utilisationfoo.bars.size
est ce qui vérifie cette colonne (sans en interroger réellementbars
).foo.bars.count
fait la requête réelle, ce qui irait à l'encontre de l'objectif du cache.Dans la plupart des cas (par exemple, Array ou String )
size
est un alias pourlength
.count
provient normalement de Enumerable et peut prendre un bloc de prédicat facultatif. Ainsienumerable.count {cond}
est [en gros](enumerable.select {cond}).length
- il peut bien sûr contourner la structure intermédiaire car il a juste besoin du nombre de prédicats correspondants.Remarque: Je ne sais pas si
count
force une évaluation de l'énumération si le bloc n'est pas spécifié ou s'il court-circuite lelength
si possible.Edit (et grâce à la réponse de Mark!):
count
Sans bloc (du moins pour les tableaux) ne force pas une évaluation. Je suppose que sans comportement formel, il est "ouvert" pour d'autres implémentations, si le fait de forcer une évaluation sans prédicat a même un sens de toute façon.la source
J'ai trouvé un bon logiciel sur http://blog.hasmanythrough.com/2008/2/27/count-length-size
J'ai aussi une expérience personnelle:
la source
Nous avons plusieurs façons de savoir combien d'éléments dans un tableau comme
.length
,.count
et.size
. Cependant, il vaut mieux utiliserarray.size
plutôt quearray.count
. Parce que.size
c'est mieux en performance.la source
Ajout de plus à la réponse de Mark Byers. Dans Ruby, la méthode
array.size
est un alias de la méthode Array # length . Il n'y a aucune différence technique dans l'utilisation de l'une de ces deux méthodes. Vous ne verrez peut-être pas non plus de différence de performances. Cependant, le faitarray.count
également le même travail mais avec quelques fonctionnalités supplémentaires Array # countIl peut être utilisé pour obtenir le nombre total d'éléments en fonction de certaines conditions. Count peut être appelé de trois manières:
Nombre de tableaux # Renvoie le nombre d'éléments dans Array
Array # count n # Renvoie le nombre d'éléments ayant la valeur n dans Array
Nombre de tableaux {| i | i.even?} Renvoie le nombre en fonction de la condition invoquée sur chaque tableau d'éléments
Ici, les trois méthodes font le même travail. Cependant, voici où le
count
devient intéressant.Disons que je veux trouver combien d'éléments de tableau le tableau contient-il avec la valeur 2
Le tableau a un total de trois éléments avec la valeur 2.
Maintenant, je veux trouver tous les éléments du tableau supérieurs à 4
Le tableau a un total de 6 éléments qui sont supérieurs à 4.
J'espère que cela donne des informations sur la
count
méthode.la source