Count, size, length...too many choices in Ruby? Ask Question

Count, size, length...too many choices in Ruby? Ask Question

I can't seem to find a definitive answer on this and I want to make sure I understand this to the "n'th level" :-)


    a = { "a" => "こんにちは", "b" => "世界" }
    a.カウント # 2
    a.サイズ # 2
    a.長さ # 2

    a = [ 10, 20 ]
    a.カウント # 2
    a.サイズ # 2
    a.長さ # 2

では、どちらを使用すればよいのでしょうか? に複数の要素があるかどうかを知りたい場合は、どちらでも問題ないように思えますが、実際の違いを理解していることを確認したいと思います。これは配列にも当てはまります。同じ結果が得られます。

また、count/size/length は ActiveRecord では意味が異なることに気付きました。現在、私は主に純粋な Ruby (1.92) に興味がありますが、AR がもたらす違いについて意見を述べてくださる方がいらっしゃれば、それもありがたいです。

ありがとう!

ベストアンサー1

配列とハッシュの場合sizeはの別名ですlengthこれらは同義語であり、まったく同じことを行います。

countより汎用性が高く、要素または述語を取得して、一致する項目のみをカウントできます。

> [1,2,3].count{|x| x > 2 }
=> 1

あなたがしないcount にパラメータを指定すると、基本的に length を呼び出すのと同じ効果があります。ただし、パフォーマンスに違いが生じる可能性があります。

私たちは、配列のソースコードこれらはほぼ同じことを行います。 の実装の 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))

ハッシュ(ソースコード) は独自の最適化バージョンを実装していないようですcountが、Enumerable(ソースコード) が使用され、すべての要素を反復処理して 1 つずつカウントします。

一般に、要素が全部でいくつあるかを知りたい場合は、ではなくlength(またはそのエイリアス) を使用することをお勧めします。sizecount


一方、ActiveRecordに関しては、重要な違い。この投稿をチェックしてください:

おすすめ記事