####Rubyの length、size、count メソッドの違いいつも忘れるので、備忘録としてささっとアウトプット。
Rubyバージョンは 2.6.2
#まず、結論
##配列の場合
####・要素数カウントしたい → length か size がベターだが countも使える
####・特定の要素 の数をカウントしたい → count
##ハッシュの場合
####・{key: value}のセット数を確認したい → length か size がベターだが countも使える
####・特定の {key: value} のセット数を確認したい → count
##文字列の場合
####・文字数カウントしたい → length か size
####・特定の文字 の数をカウントしたい → count
#ここから解説
##length / size
length と size は同じ。エイリアス。
機能としては下記のように配列の要素数、ハッシュの{key: value}のセット数、文字列の文字数を数値で返す。
全要素数、全{key: value}セット数、文字数を返す。それたけ。
型 | 配列 | ハッシュ | 文字列 |
---|---|---|---|
戻り値 | 配列の要素数 | {key: value}の数 | 文字数 |
使用例
#配列
[1, 2, 3].size #=> 3
#ハッシュ
{name: "Taro", age: 20, occupation: "Student"}.length #=> 3
#文字列
"aiueo".size #=> 5
シンプル! length と size は以上!
##count
count の機能としては、length / size と同じように配列の要素数、ハッシュの{key: value}のセット数返す。
length と size との違いは count は引数を取れるということ。
#####文字通り、引数と同じ配列の要素、引数と同じ文字列の数をカウントする。
#####つまり count は(処理速度という観点を除けば) length / size の ほぼ上位互換的な存在。
引数には普通に文字列、数値、そしてブロックも取れる。
####※だた注意点
#####文字列の場合、シンプルに全文字数カウントはできない。(引数が必須)
この注意点を踏まえて下記の使用例。
使用例
# 配列(引数あり)
[1, 2, 3].count(3) #=> 1
# 配列(引数なし)
[1, 2, 3].count #=> 3
# ハッシュ(引数あり)
{name: "Taro", age: 20, occupation: "Student"}.count([:name, "Taro"]) #=> 1
# ハッシュ(引数なし)
{name: "Taro", age: 20, occupation: "Student"}.count #=> 3
# 文字列(引数あり)
"aiueo".count("a") #=> 1
# 文字列(引数なし) ※既述のように引数なしでは使えず、引数が必要とエラーが出ます。size or lengthを使いましょう。
"aiueo".count
ArgumentError: wrong number of arguments (given 0, expected 1+)
from (pry):7:in `count
続いて、上述した引数がブロックの時の使い方
#数値の配列から奇数をカウント
[1, 2, 3, 4, 5, 6, 7, 8, 9].count { |item| item.even? == true} #=> 4
#数値の配列から偶数をカウント
[1, 2, 3, 4, 5, 6, 7, 8, 9].count { |item| item.odd? == true} #=> 5
表にするとこんな感じ
メソッド | 配列(全部) | ハッシュ(全部) | 文字列(全部) | 配列(引数指定) | ハッシュ(引数指定) | 文字列(引数指定) | 引数にブロック使用 |
---|---|---|---|---|---|---|---|
size/length | ◯ | ◯ | ◯ | × | × | × | × |
count | ◯ | ◯ | × | ◯ | ◯ | ◯ | ◯ |
##※length / size と count の処理速度については @scivola さんからわかりやすいコメントをいただいたのでそちら参照いただけると幸いです。
#まとめ
全カウントの場合は処理速度が早い length / size を使い、
####特定の文字数や要素をカウントしたい時のみ count を使う!!