148

私はこれについて決定的な答えを見つけることができないようです、そして私はこれを「n番目のレベル」まで理解していることを確認したいと思います:-)

    a = {"a" => "Hello"、 "b" => "World"}
    a.count#2
    a。サイズ#2
    a。長さ#2

    a = [10、20]
    a.count#2
    a。サイズ#2
    a。長さ#2

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

また、ActiveRecordではカウント/サイズ/長さが異なる意味を持っていることに気づきました。私は今、純粋なRuby(1.92)に主に興味がありますが、ARがもたらす違いについて誰かがチャイムを鳴らしたいのであれば、それもありがたいです。

ありがとう!

4

6 に答える 6

201

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

countより用途が広い-要素または述語を取り、一致するアイテムのみをカウントすることができます。

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

カウントするパラメーターを指定しない場合、基本的に呼び出し長と同じ効果があります。ただし、パフォーマンスに違いがある場合があります。

Arrayのソースコードから、ほぼ同じことをしていることがわかります。実装用の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)からの実装が使用されます。これは、すべての要素を繰り返し、それらを1つずつカウントします。Enumerable

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


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

于 2010-12-29T01:08:25.260 に答える
10

データベース接続を利用するアプリケーションには決定的な違いがあります。

多くのORM(ActiveRecord、DataMapperなど)を使用している場合、一般的な理解では、.sizeは、データベースからすべてのアイテムを要求するクエリを生成し('select * from mytable')、アイテムの数を提供します。その結果、.countは単一のクエリ('mytableからcount(*)を選択')を生成しますが、これはかなり高速です。

これらのORMは非常に普及しているため、驚き最小の原則に従います。一般に、メモリにすでに何かがある場合は.sizeを使用し、コードがデータベース(またはAPIを介した外部サービス)へのリクエストを生成する場合は.countを使用します。

于 2010-12-29T08:00:44.827 に答える
7

ほとんどの場合(たとえば、配列または文字列sizeはのエイリアスですlength

count通常はEnumerableから取得され、オプションの述語ブロックを取ることができます。したがってenumerable.count {cond}、[大まかに] (enumerable.select {cond}).length-一致する述語の数が必要なだけなので、もちろん中間構造をバイパスできます。

注:ブロックが指定されていない場合、または可能であればブロックが短絡している場合に、列挙の評価をcount 強制lengthするかどうかはわかりません。

編集(そしてMarkの答えのおかげで!): count ブロックなし(少なくとも配列の場合)は評価を強制しません。とにかく、述語なしで評価を強制することが本当に理にかなっているのであれば、正式な動作がなければ、他の実装に対して「オープン」であると思います。

于 2010-12-29T01:10:50.317 に答える
5

http://blog.hasmanythrough.com/2008/2/27/count-length-sizeで良い回答を見つけました

ActiveRecordでは、関連付けに含まれるレコードの数を確認する方法がいくつかあり、それらの動作には微妙な違いがあります。

post.comments.count-SQLCOUNTクエリを使用して要素の数を決定します。関連する要素のサブセットのみをカウントする条件を指定することもできます(例::conditions => {:author_name => "josh"})。アソシエーションにカウンターキャッシュを設定すると、#countは新しいクエリを実行する代わりに、キャッシュされた値を返します。

post.comments.length-これは常に関連付けの内容をメモリにロードし、ロードされた要素の数を返します。アソシエーションが以前にロードされていて、別の方法(post.comments.create(...)ではなくComment.create(...)など)で新しいコメントが作成された場合、これによって更新が強制されることはありません。

post.comments.size-これは、前の2つのオプションの組み合わせとして機能します。コレクションがすでにロードされている場合は、#lengthを呼び出すのと同じようにその長さを返します。まだロードされていない場合は、#countを呼び出すようなものです。

また、私は個人的な経験があります:

<%= h(params.size.to_s) %> # works_like_that !
<%= h(params.count.to_s) %> # does_not_work_like_that !
于 2011-11-20T00:37:57.300 に答える
2

.length、、などの配列内の要素の数を確認する方法はいくつかあり.countます.size。ただし、を使用するarray.sizeよりも使用することをお勧めしますarray.count.sizeパフォーマンスが優れているからです。

于 2016-04-06T13:02:14.950 に答える
1

MarkByersの回答にさらに追加します。Rubyでは、メソッドはArray#lengtharray.sizeメソッドのエイリアスです。これら2つの方法のいずれを使用しても技術的な違いはありません。おそらく、パフォーマンスにも違いは見られないでしょう。ただし、も同じ仕事をしますが、いくつかの追加機能がありますArray#countarray.count

条件に基づいて要素の総数を取得するために使用できます。カウントは、次の3つの方法で呼び出すことができます。

Array#count #配列内の要素の数を返します

Array#count n #配列内の値nを持つ要素の数を返します

Array#count {| i | i.even?} 各要素配列で呼び出された条件に基づいてカウントを返します

array = [1,2,3,4,5,6,7,4,3,2,4,5,6,7,1,2,4]

array.size     # => 17
array.length   # => 17
array.count    # => 17

ここでは、3つの方法すべてが同じ仕事をします。しかし、ここcountが興味深いところです。

たとえば、値2の配列に含まれる配列要素の数を調べたいとします。

array.count 2    # => 3

配列には、値が2の合計3つの要素があります。

ここで、4より大きいすべての配列要素を検索します

array.count{|i| i > 4}   # =>6

配列には、4より大きい合計6つの要素があります。

私はそれが方法についてのいくつかの情報を与えることを願っていますcount

于 2016-03-15T06:07:04.157 に答える