Tech Hotoke Blog

IT観音とは私のことです。

Ruby 再入門 Enumerable#each_with_object

Enumerable#each_with_object

与えられた任意のオブジェクトと要素をブロックに渡し繰り返し、最初に与えられたオブジェクトを返します。

  • サンプルコード
  • 以下のような形で、より関数型っぽい書き方ができる。
str = "hello world"
char_counts = {}

str.each_char do |char|
  counts[char] = counts.fetch(char, 0) + 1
end
puts char_counts
str = "hello world"

char_counts = str.each_char.with_object({}) do |char, counts|
  counts[char] = counts.fetch(char, 0) + 1
end
puts char_counts

Enumerable#each_with_object (Ruby 3.4 リファレンスマニュアル)

そもそもEnumerableってなんだっけ?

  • 繰り返しを行なうクラスのための Mix-in。
  • このモジュールのメソッドは全て each を用いて定義されているので、インクルードするクラスには each が定義されていなければなりません。
  • Array, Hash, Range, Enumerator等のクラスで、 Enumerableモジュールはインクルードされています。
  • ただし、効率化のため、そのクラスでEnumerableと同名・同等の機能を再定義(オーバーライド)しているケースも少なくなく、特にArrayクラスでは同名のメソッドを再定義していることが多いです。