QA@IT

Rubyのsize/length/countの違いは?

10126 PV

Rubyの配列やハッシュには、似たような3つのメソッドがあります。

> [1,2,3,4,5].count
 => 5
> [1,2,3,4,5].length
 => 5
> [1,2,3,4,5].size
 => 5
>

どれも同じことができるように思えますが、使い分け方があれば教えてください。

回答

sakuroさんの説明通りですが、countだけがほかと違って条件に合う要素数を数え上げる使い方があります。Enumerable#countの3つの用例は、

[1,2,3,4,5].count => 5
[1,2,3,4,5].count(2) => 1
[1,2,3,4,5].count{|x|x%2==0} => 2

ですね。[1,2,3,4,5].count(2) という例は、何かインデックスに関係してるように見えなくないですが、数値の2の登場回数を数えています。数えるのはオブジェクトなら何でも良いので文字列でもオッケーです。

%w(fizz buzz buzz fizz fizz).count("fizz") => 3

count だけが動詞で、size/lengthとはだいぶ違いますね。

編集 履歴 (1)

#size#length は、配列やハッシュテーブルの要素数を返します。これらのインスタンスは自身が持つ要素数を 最初から知っている のでそれをじかに返します。 #size#length は同じ動作のメソッドなので、読みやすいほうを使えばよいです。

#countEnumerable モジュールのメソッドで、基本的には #each メソッドを使用して要素数を 実際に数え て返します。また、引数やブロックを受け付けます。

  • 何も与えなければ #each で要素を順に見て数え上げ、要素数を返します。
  • 引数が与えられた場合は、引数と一致するものを数え上げます。
  • ブロックが与えられた場合は、ブロックが真になるものの数を返します。
    • 両方与えた場合はブロックが無視されます。
  • Array#count は、効率を鑑みてか再定義されています。
編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。