Não consigo encontrar uma resposta definitiva sobre isso e quero ter certeza de que entendo isso no "nésimo nível" :-)
a = {"a" => "Olá", "b" => "Mundo"} a.contagem # 2 a.size # 2 a.length # 2 a = [10, 20] a.contagem # 2 a.size # 2 a.length # 2
Então, qual usar? Se eu quiser saber se a possui mais de um elemento, isso não parece importar, mas quero ter certeza de que entendi a diferença real. Isso se aplica a matrizes também. Eu obtenho os mesmos resultados.
Além disso, percebo que contagem / tamanho / comprimento têm significados diferentes com o ActiveRecord. Estou interessado principalmente em Ruby puro (1,92) agora, mas se alguém quiser conversar sobre a diferença que o AR faz, isso também seria apreciado.
Obrigado!
ruby
activerecord
size
content-length
cbmeeks
fonte
fonte
Array#nitems
:, que retorna o número de itens que não são NIL em uma matriz. Mas isso não está mais disponível no Ruby 1.9Respostas:
Para matrizes e hashes
size
é um alias paralength
. Eles são sinônimos e fazem exatamente a mesma coisa.count
é mais versátil - ele pode pegar um elemento ou predicado e contar apenas os itens correspondentes.No caso em que você não fornece um parâmetro para contar, ele tem basicamente o mesmo efeito que a duração da chamada. Pode haver uma diferença de desempenho.
Podemos ver no código-fonte do Array que eles fazem quase exatamente a mesma coisa. Aqui está o código C para a implementação de
array.length
:E aqui está a parte relevante da implementação de
array.count
:O código para
array.count
faz algumas verificações extras, mas no final pede exatamente o mesmo código:LONG2NUM(RARRAY_LEN(ary))
.Os hashes ( código fonte ), por outro lado, não parecem implementar sua própria versão otimizada, de
count
modo que a implementação deEnumerable
( código fonte ) é usada, que itera sobre todos os elementos e os conta um por um.Em geral, eu recomendaria usar
length
(ou seu apelidosize
) em vez decount
se você quiser saber quantos elementos existem no total.Em relação ActiveRecord, por outro lado, não são diferenças importantes. confira este post:
fonte
Há uma diferença crucial para aplicativos que fazem uso de conexões com o banco de dados.
Quando você está usando muitos ORMs (ActiveRecord, DataMapper etc.), o entendimento geral é que .size gerará uma consulta que solicita todos os itens do banco de dados ('select * from mytable') e fornece o número de itens resultante, enquanto .count gerará uma única consulta ('select count (*) from mytable') que é consideravelmente mais rápida.
Como essas ORMs são tão predominantes, eu sigo o princípio do mínimo espanto. Em geral, se já tenho algo na memória, uso .size e, se meu código gerar uma solicitação para um banco de dados (ou serviço externo por meio de uma API), uso .count.
fonte
counter_cache
. Se tiver uma tabela,foo
e tem has_manybar
, você terá uma colunafoo
nomeadabars_count
que será atualizada sempre que umabar
criação / destruição for criada. Usarfoo.bars.size
é o que verifica essa coluna (sem realmente consultar nenhumabars
).foo.bars.count
faz a consulta real, o que anularia a finalidade do cache.Na maioria dos casos (por exemplo, Array ou String )
size
é um alias paralength
.count
normalmente vem de Enumerable e pode receber um bloco de predicado opcional. Assimenumerable.count {cond}
é [aproximadamente](enumerable.select {cond}).length
- é claro que pode ignorar a estrutura intermediária, pois precisa apenas da contagem de predicados correspondentes.Nota: Não tenho certeza se
count
força uma avaliação da enumeração se o bloco não estiver especificado ou se houver um curto-circuito nolength
possível.Editar (e graças à resposta de Mark!):
count
Sem um bloco (pelo menos para Arrays) não força uma avaliação. Suponho que, sem um comportamento formal, esteja "aberto" para outras implementações, se forçar uma avaliação sem um predicado realmente faz sentido de qualquer maneira.fonte
Encontrei um bom answare em http://blog.hasmanythrough.com/2008/2/27/count-length-size
Também tenho uma experiência pessoal:
fonte
Temos várias maneiras de descobrir quantos elementos em uma matriz como
.length
,.count
e.size
. No entanto, é melhor usararray.size
do quearray.count
. Porque.size
é melhor no desempenho.fonte
Adicionando mais à resposta de Mark Byers. Em Ruby, o método
array.size
é um alias para o método Array # length . Não há diferença técnica no uso de qualquer um desses dois métodos. Possivelmente você não verá nenhuma diferença no desempenho também. No entanto, oarray.count
também faz o mesmo trabalho, mas com algumas funcionalidades extras Array # countPode ser usado para obter o número total de elementos com base em alguma condição. A contagem pode ser chamada de três maneiras:
Array # count # Retorna o número de elementos na Array
Matriz # count n # Retorna o número de elementos com o valor n na Matriz
Matriz # count {| i | i.even?} Retorna a contagem com base na condição chamada em cada matriz de elemento
Aqui todos os três métodos fazem o mesmo trabalho. No entanto, aqui é onde
count
fica interessante.Digamos, quero descobrir quantos elementos da matriz a matriz contém com o valor 2
A matriz possui um total de três elementos com o valor 2.
Agora, quero encontrar todos os elementos da matriz maiores que 4
A matriz possui um total de 6 elementos>> 4.
Espero que ele dê algumas informações sobre o
count
método.fonte