読者です 読者をやめる 読者になる 読者になる

Ruby の iolite を Hash#map に渡す場合の注意

Ruby

さて、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"]

これで正しく動作するようになりました。
この問題をライブラリ側で回避させる方法はあるのだろうか。