Parece que no puedo encontrar una respuesta definitiva sobre esto y quiero asegurarme de que entiendo esto al "nivel n" :-)
a = {"a" => "Hola", "b" => "Mundo"} una cuenta # 2 a. tamaño # 2 a. longitud # 2 a = [10, 20] una cuenta # 2 a. tamaño # 2 a. longitud # 2
Entonces, ¿cuál usar? Si quiero saber si un tiene más de un elemento, entonces no parece importar, pero quiero asegurarme de que entiendo la diferencia real. Esto también se aplica a las matrices. Obtuve los mismos resultados.
Además, me doy cuenta de que cuenta / tamaño / longitud tienen diferentes significados con ActiveRecord. En este momento, estoy principalmente interesado en Ruby puro (1.92), pero si alguien quiere intervenir en la diferencia, AR también lo agradecería.
¡Gracias!
ruby
activerecord
size
content-length
cbmeeks
fuente
fuente
Array#nitems
que devuelve el número de elementos que no son NIL en una matriz. Pero eso ya no está disponible en Ruby 1.9Respuestas:
Para matrices y hashes
size
es un alias paralength
. Son sinónimos y hacen exactamente lo mismo.count
es más versátil: puede tomar un elemento o predicado y contar solo los elementos que coinciden.En el caso de que no proporcione un parámetro para contar, básicamente tiene el mismo efecto que la longitud de la llamada. Sin embargo, puede haber una diferencia de rendimiento.
Podemos ver en el código fuente de Array que hacen casi exactamente lo mismo. Aquí está el código C para la implementación de
array.length
:Y aquí está la parte relevante de la implementación de
array.count
:El código para
array.count
hace algunas comprobaciones adicionales, pero al final llama exactamente el mismo código:LONG2NUM(RARRAY_LEN(ary))
.Los hashes ( código fuente ), por otro lado, no parecen implementar su propia versión optimizada, por
count
lo que se usa la implementación deEnumerable
( código fuente ), que itera sobre todos los elementos y los cuenta uno por uno.En general, recomendaría usar
length
(o su aliassize
) en lugar decount
si desea saber cuántos elementos hay en total.En cuanto a ActiveRecord, por el contrario, no son diferencias importantes. mira esta publicación:
fuente
Hay una diferencia crucial para las aplicaciones que utilizan conexiones de base de datos.
Cuando utiliza muchos ORM (ActiveRecord, DataMapper, etc.), el entendimiento general es que .size generará una consulta que solicite todos los elementos de la base de datos ('select * from mytable') y luego le dará la cantidad de elementos resultante, mientras que .count generará una sola consulta ('select count (*) from mytable') que es considerablemente más rápido.
Debido a que estos ORM son tan frecuentes, sigo el principio de menor asombro. En general, si ya tengo algo en la memoria, entonces uso .size, y si mi código generará una solicitud a una base de datos (o servicio externo a través de una API), uso .count.
fuente
counter_cache
. Si tiene una tabla,foo
y tiene_muchasbar
, tendrá una columna confoo
nombrebars_count
que se actualiza cada vez quebar
se crea / destruye una. El usofoo.bars.size
es lo que comprueba esa columna (sin consultar realmente ningunabars
).foo.bars.count
realiza la consulta real, lo que anularía el propósito del caché.En la mayoría de los casos (por ejemplo, Array o String )
size
es un alias paralength
.count
normalmente proviene de Enumerable y puede tomar un bloque de predicados opcional. Asíenumerable.count {cond}
es [aproximadamente](enumerable.select {cond}).length
: por supuesto, puede pasar por alto la estructura intermedia, ya que solo necesita el recuento de predicados coincidentes.Nota: No estoy seguro si
count
fuerza una evaluación de la enumeración si el bloque no está especificado o si hace un cortocircuito en ellength
caso de que sea posible.Editar (y gracias a la respuesta de Mark!):
count
Sin un bloque (al menos para las matrices) no obliga a una evaluación. Supongo que sin un comportamiento formal está "abierto" para otras implementaciones, si forzar una evaluación sin un predicado realmente tiene sentido de todos modos.fuente
Encontré un buen answare en http://blog.hasmanythrough.com/2008/2/27/count-length-size
También tengo una experiencia personal:
fuente
Tenemos varias formas de averiguar cuántos elementos de una matriz
.length
, como.count
y.size
. Sin embargo, es mejor usar enarray.size
lugar dearray.count
. Porque.size
es mejor en rendimiento.fuente
Añadiendo más a la respuesta de Mark Byers. En Ruby, el método
array.size
es un alias del método Array # length . No hay diferencia técnica en el uso de ninguno de estos dos métodos. Posiblemente no verá ninguna diferencia en el rendimiento también. Sin embargo,array.count
también hace el mismo trabajo pero con algunas funcionalidades adicionales Array # countSe puede usar para obtener el número total de elementos en función de alguna condición. Se puede llamar a Count de tres maneras:
Array # count # Devuelve el número de elementos en Array
Array # count n # Devuelve el número de elementos que tienen valor n en Array
Array # count {| i | i.even?} Devuelve el recuento basado en la condición invocada en cada matriz de elementos
Aquí los tres métodos hacen el mismo trabajo. Sin embargo, aquí es donde se
count
pone interesante.Digamos, quiero encontrar cuántos elementos de matriz contiene la matriz con el valor 2
La matriz tiene un total de tres elementos con un valor de 2.
Ahora, quiero encontrar todos los elementos de matriz mayores que 4
La matriz tiene un total de 6 elementos que son> que 4.
Espero que brinde información sobre el
count
método.fuente