こんばんは、GW中もどんどんいろいろなセリフを喋るように次男がなってきました。@kjunichiです。
背景
mrubyで画像変換処理を行うモジュールmruby-mrmagickを作り始めた。名前の通り、rmagickのAPIをmrubyで使えるように開発を進めている。そこで、今回の疑問にぶち当たった。Rmagickでは、処理の細かなオプションをブロックで指定するAPIになっており、
self.foo=bar
の形式で指定することになっていた。yieldで楽勝と思いきや、selfがyieldだと、メソッドのインスタンス変数とはならず、ブロック作成時の例えば、main等で実行されてしまうことがわかった。
mrubyでselfを呼び出されたメソッドのインスタンスとして実行するには
class Foo
@width
def mon(&blk)
p self
blk.call
end
def montage(&blk)
instance_eval(&blk)
p @width
end
attr_accessor :width
end
a=Foo.new
p a
p self
b=a.montage {
p self
self.width=100
}
instance_evalを使えば、意図した通りの動作になった。これで、mrmagickの開発が進むかも。
関連記事