1. ホーム
  2. ruby

[解決済み] カウント、サイズ、長さ...Rubyの選択肢は多すぎ?

2022-05-07 05:27:57

質問

この件に関して明確な答えが見つからないようなので、私がこの件について理解しているかどうか確認したいのですが、quot; n'th level" :-)

    a = { "a" => "こんにちは", "b" => "世界" }.
    a.count # 2
    a.size # 2
    a.length # 2

    a = [ 10, 20 ]
    a.count # 2
    a.size # 2
    a.length # 2


では、どちらを使えばいいのでしょうか? aが複数の要素を持っているかどうかを知りたいのであれば、それは問題ではないように思えますが、本当の違いを理解しておきたいと思うのです。 これは配列にも当てはまります。 私は同じ結果を得ました。

また、ActiveRecordではcount/size/lengthの意味が異なることは承知しています。 私は今、純粋なRuby(1.92)にほとんど興味がありますが、もし誰かがARがもたらす違いについて助言してくれるなら、それもまたありがたいことです。

ありがとうございます。

解決方法は?

配列とハッシュの場合 size のエイリアスです。 length . これらは同義語であり、まったく同じことをします。

count はより多機能で、要素や述語を受け取り、マッチする項目のみをカウントすることができます。

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


という場合 しない を指定すると、基本的に length を呼び出すのと同じ効果が得られます。しかし、パフォーマンスには差が出る可能性があります。

からわかることは のソースコードは、Array というように、ほとんど同じことをやっているのです。以下は 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 (またはそのエイリアス size ではなく count というように、全部でいくつの要素があるのかを知ることができます。


一方、ActiveRecordに関しては あり この投稿をご覧ください。