Ruby の iolite を Hash#map に渡す場合の注意
さて、iolite を利用するとブロックを抽象的に記述する事ができるのですが、Hash#map
に渡すときに注意する必要があります。
例えば、
homu = { "name" => "homu", "age" => "14"} # これを iolite を使って抽象化したい homu.map { |key, value| key + " : " + value } # => ["name : homu", "age : 14"]
というような処理で iolite を利用したい場合、
homu.map &arg1 + " : " + arg2
と、いう風に置き換えたくなります。
しかし、これは正しく動作しません。
なぜなら iolite の内部では可変長引数で引数を受け取るため、Hash のキーと値は配列として第一引数に渡されるためです。
# 内部ではこのように受け取ってる homu.map { |*args| ... }
これを正しく動作させるためには第一引数のみを参照する必要があります。
require "iolite" include Iolite::Placeholders homu = { "name" => "homu", "age" => "14"} homu.map &arg1[0] + " : " + arg1[1] # => ["name : homu", "age : 14"]
これで正しく動作するようになりました。
この問題をライブラリ側で回避させる方法はあるのだろうか。