Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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ベストプラクティス -プロフェッショナルによるコードとテクニック