【Ruby】特定の文字をカウントするメソッド


概要

下記の問題が出された際、間違ったため備忘録として残します。
【問題】
任意の文字列がいくつあるか数えてその数を出力するメソッドを作成して下さい

私の回答

私は下記のような回答をしてしまいました。
※ちなみに、間違いです

Ruby
def count_hi(word)
  puts word.count('hi')
end

word = "hi!hideyuki. hidemi."
count_hi(word)

本来は「3」が正解ですが、上記記述だと「8」となってしまいます

正解

Ruby
def count_hi(word)
  puts word.scan('hi').length
end

word = "hi!hideyuki. hidemi."
count_hi(word)

上記、記述だと「8」と表示されます

解説

countは"hi"ではなく、"h","i"それぞれの個数をカウントしてしまいます。

scanはマッチした部分文字列の配列を返します。
そのため、lengthが無いと下記のような表示となります。

Ruby
puts word.scah('hi')
# hi hi hi と表示されます

lengthは本来は文字列の文字数を返しますが、word.scan('hi').lengthとすることで、scanで返された配列をカウントすることとなります。

参考

特定の文字の出現回数をカウントする - Ruby Tips!
String#count (Ruby 2.7.0 リファレンスマニュアル) - Ruby-lang
String#scan (Ruby 2.7.0 リファレンスマニュアル) - Ruby-lang
String#length (Ruby 2.7.0 リファレンスマニュアル) - Ruby-lang