ruby - 计数、尺寸、长度……Ruby 中的选择太多了吗?

标签 ruby activerecord size content-length

我似乎找不到关于这个的明确答案,我想确保我理解到“第 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 带来的不同,我也将不胜感激。

谢谢!

最佳答案

对于数组和哈希 sizelength 的别名.它们是同义词,做的事情完全相同。

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/

相关文章:

ruby 显式方法返回类型

ruby - 基于 ANU 量子随机数服务器的随机数

javascript - 适用于不同设备的响应式 Canvas

为 Ruby FFI 接口(interface)从字符串转换为 const char* 时的 C++ 字符编码

ruby-on-rails - gem安装权限问题

mysql - 仅列出与 Rails 3 中的用户相关的问题

ruby-on-rails - 如何使用 Rails 控制台从表中删除列

ruby-on-rails - 随着 Rails 4.2.3 改变 where_values 的行为,我如何获得 where_values 的有效 SQL?

css - 缩放图像直到 X 或 Y 与容器相同,然后裁剪其余部分

MySQL 长于文本大小,短于中文本大小