LoginSignup
3
3

More than 5 years have passed since last update.

ブロック実行にはinstance_exec

Posted at

ブロックの実行コンテキストを変えるのにinstance_evalを使っていたら、lambdaを投げたときに詰まってしまいました。

失敗するコード例

fun = -> { p self }

1.instance_eval(&fun)

解説

るりまを読めばきちんと書いてあるのですが、instance_eval {|obj| ... } -> objectとあるように、instance_evalにブロックを渡した場合、ブロックへの引数としてもオブジェクトが渡されます。

そして、lambdaである以上引数の数が違えばエラーとなってしまうので、これではうまく動かないのでした。

解決策

ブロックの実行であれば別にinstance_execがあって、こちらは呼び出し時に渡した引数がそのままブロックに渡される仕様となっています。selfの変更をしたいだけなら、引数を一つも渡さなければ引数0個のlambdaで問題なく動きます。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3