我似乎找不到关于这个的明确答案,我想确保我理解到“第 n 级”:-)
a = { "a" => "Hello", "b" => "World" } a.count # 2 a.size # 2 a.length # 2 a = [ 10, 20 ] a.count # 2 a.size # 2 a.length # 2
那么该用哪个呢?如果我想知道 a 是否有多个元素,那么这似乎并不重要,但我想确保我了解真正的区别。这也适用于数组。我得到了相同的结果。
此外,我意识到 count/size/length 与 ActiveRecord 有不同的含义。我现在最感兴趣的是纯 Ruby (1.92),但如果有人想谈谈 AR 带来的不同,我也将不胜感激。
谢谢!
最佳答案
对于数组和哈希 size
是 length
的别名.它们是同义词,做的事情完全相同。
count
更通用——它可以接受一个元素或谓词,并只计算那些匹配的项目。
> [1,2,3].count{|x| x > 2 }
=> 1
在您不提供参数来计数的情况下,它与调用 length 的效果基本相同。但是可能存在性能差异。
从source code for 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) 的实现是used,它遍历所有元素并一个一个地计算它们。
一般来说,如果您想知道那里有多少元素,我建议您使用length
(或其别名size
)而不是count
完全是。
另一方面,关于 ActiveRecord, 存在重要差异。查看这篇文章:
关于ruby - 计数、尺寸、长度……Ruby 中的选择太多了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550770/