Enumerableモジュール

先日、帰省からの帰りの新幹線で読む用に、以前から気になっていた以下の二冊を購入。

初めてのRuby

初めてのRuby

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

「初めてのRuby」の著者はYuguiさん。
あ、「RHGの逆襲」初回しか参加してないや… 公私共にドタバタしてたりOCaml弄くってたら、すっかり…


で、まだ読んでいる途中なのですが、Rubyという言語についてわかりやすく体系的に纏められている一方、「筆者/Rubyistならこう書く」的な実践的な情報も織り込まれていたりして、明らかに「買って得したなぁ」という感想。サンプルコードの変数名とかも凝っているので元ネタ探しも楽しめそう。


読んでいて多々発見があったのですが、その中の一つがEnumerableモジュール。includeしてeachメソッドさえ実装すれば、EnumerableなメソッドをMix-inできるそうな。恥ずかしながら初耳。


ということで練習。

class Tousa
  include Enumerable

  def initialize(count, init, diff)
    @count  = count
    @init = init
    @diff = diff
  end

  def each
    val = @init
    @count.times do
      yield val
      val += @diff
    end
  end
end

ts = Tousa.new 5, 1, 3

ts.each_with_index {|v, i| p "<<<#{i}:#{v}>>>"}

p ts.inject(0) {|sum, v| sum += v}

Enumerableモジュールをincludeしてeachメソッドのみ実装した等差数列クラスを定義。生成したインスタンスでeach_with_indexやinjectメソッドを使ってみるテスト。

実行させてみると…

"<<<0:1>>>"
"<<<1:4>>>"
"<<<2:7>>>"
"<<<3:10>>>"
"<<<4:13>>>"
35

なるほどぉ。