ブロックの実行コンテキストを変えるのにinstance_eval
を使っていたら、lambda
を投げたときに詰まってしまいました。
失敗するコード例
fun = -> { p self }
1.instance_eval(&fun)
解説
るりまを読めばきちんと書いてあるのですが、instance_eval {|obj| ... } -> object
とあるように、instance_eval
にブロックを渡した場合、ブロックへの引数としてもオブジェクトが渡されます。
そして、lambda
である以上引数の数が違えばエラーとなってしまうので、これではうまく動かないのでした。
解決策
ブロックの実行であれば別にinstance_exec
があって、こちらは呼び出し時に渡した引数がそのままブロックに渡される仕様となっています。self
の変更をしたいだけなら、引数を一つも渡さなければ引数0個のlambda
で問題なく動きます。