Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Enumurableなメソッドでyieldを扱う

enumrableモジュールのメソッド内でもyieldを使う事ができたのですね……
以前の記事の時点では気付いていませんでした。

class NewAry < Array
  def foo
    map {|e| yield(e)}.join("\n") 
  end
end
#=> nil

> a = NewAry.new(16){|e| "0x%04x" % [e ** 2]}
#=> ["0x0000", "0x0001", "0x0004", "0x0009", "0x0010", "0x0019", "0x0024", "0x0031", "0x0040", "0x0051", "0x0064", "0x0079", "0x0090", "0x00a9", "0x00c4", "0x00e1"]

> a.foo {|e| pp e }
"0x0000"
"0x0001"
"0x0004"
(中略)
"0x00c4"
"0x00e1"
#=> "0x0000\n0x0001\n0x0004\n0x0009\n0x0010\n0x0019\n0x0024\n0x0031\n0x0040\n0x0051\n0x0064\n0x0079\n0x0090\n0x00a9\n0x00c4\n0x00e1"

他のEnumrableモジュールと同様、ぶん回すときに細工をする事が可能です。

> a.foo {|e| pp "%10s => %4s" % [e, e.to_i(16)] }
"    0x0000 =>    0"
"    0x0001 =>    1"
"    0x0004 =>    4"
(中略)
"    0x00c4 =>  196"
"    0x00e1 =>  225"
#=> "    0x0000 =>    0\n    0x0001 =>    1\n    0x0004 =>    4\n    0x0009 =>    9\n    0x0010 =>   16\n    0x0019 =>   25\n    0x0024 =>   36\n    0x0031 =>   49\n    0x0040 =>   64\n    0x0051 =>   81\n    0x0064 =>  100\n    0x0079 =>  121\n    0x0090 =>  144\n    0x00a9 =>  169\n    0x00c4 =>  196\n    0x00e1 =>  225"

ちゃんと定義してあげれば、「&:」を持たせる事も出来るはずです。
次回以降、気が向いたら挑戦します

参考もと

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック