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