对于数组和哈希size http://ruby-doc.org/core-1.9.3/Array.html#method-i-size是一个别名length http://ruby-doc.org/core-1.9.3/Array.html#method-i-length。它们是同义词并且做完全相同的事情。
count http://apidock.com/ruby/Array/count更通用 - 它可以采用元素或谓词并仅计算那些匹配的项目。
> [1,2,3].count{|x| x > 2 }
=> 1
如果你don't提供一个参数来计数,与调用length的效果基本相同。但可能存在性能差异。
我们可以从数组的源代码 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v1_9_2_0/array.c?view=markup他们做几乎完全相同的事情。这是实现的C代码array.length
:
static VALUE
rb_ary_length(VALUE ary)
{
long len = RARRAY_LEN(ary);
return LONG2NUM(len);
}
这是实施的相关部分array.count
:
static VALUE
rb_ary_count(int argc, VALUE *argv, VALUE ary)
{
long n = 0;
if (argc == 0) {
VALUE *p, *pend;
if (!rb_block_given_p())
return LONG2NUM(RARRAY_LEN(ary));
// etc..
}
}
代码为array.count
做了一些额外的检查,但最终调用了完全相同的代码:LONG2NUM(RARRAY_LEN(ary))
.
Hashes (源代码 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v1_9_2_0/hash.c?view=markup)另一方面似乎没有实现他们自己的优化版本count
所以实施从Enumerable
(源代码 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v1_9_2_0/enum.c?view=markup使用 ),它会迭代所有元素并对它们进行一一计数。
一般来说,我建议使用length
(或其别名size
) 而不是count
如果你想知道总共有多少个元素。
另一方面,对于 ActiveRecord,有are重要的差异。看看这个帖子:
- 计算 ActiveRecord 关联:计数、大小还是长度? http://rhnh.net/2007/09/26/counting-activerecord-associations-count-size-or-length