对于数组和哈希表,
size
是
length
的别名。它们是同义词,执行的功能完全相同。
count
更加通用 - 它可以接受元素或断言,并只计算匹配的项。
> [1,2,3].count{|x| x > 2 }
=> 1
如果您不提供计数参数,它与调用长度基本相同。但是可能会有性能差异。
从Array的源代码中可以看出,它们几乎完全做了相同的事情。这是array.length
实现的C代码:
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))
。
另一方面,哈希表(source code)似乎没有实现自己优化的count
版本,因此使用了来自Enumerable
(source code)的实现,该实现会遍历所有元素并逐个计数。
总的来说,如果您想知道总共有多少个元素,请使用length
(或其别名size
),而不是count
。
然而,就 ActiveRecord 而言,存在重要的区别。请查看此帖子:
Array # nitems
,它返回数组中非NIL项的数量。但是在Ruby 1.9中不再可用。 - Tilo