From: Gavin Sinclair Date: 2010-07-18T00:25:18+09:00 Subject: Instance eval in 1.8 and 1.9 Hi, Porting a program from 1.8 to 1.9, I hit a stumbling block in the use of instance_eval. The following code works in 1.8 but not 1.9. instance_eval in 1.9 does not allow you to use a lambda as a block. The solution is to use a proc instead. I understand that lambdas are like methods and procs are like blocks, but what gets me is the incredibly unhelpful error message. Anyway, the code (can also see it at http://gist.github.com/479572 ) class InstanceEval def initialize(x) @block = x @context = Object.new end def run code = @block result = @object.instance_eval(&code) "* run --> #{result.inspect}" end end p = proc { :p } l = lambda { :l } # (line 16 -- for the error message below) puts InstanceEval.new(p).run puts InstanceEval.new(l).run The output in 1.8: * run --> :p * run --> :l The output in 1.9: * run --> :p code.rb:16:in `block in
': wrong number of arguments (1 for 0) (ArgumentError) from code.rb:10:in `instance_eval' from code.rb:10:in `run' from code.rb:19:in `
' To what method have I passed one argument where zero arguments were expected? Is the average Ruby programmer supposed to know that instance_eval can't take a lambda in Ruby 1.9? Perhaps it should say so in the documentation. (http://bit.ly/96HBeb) Is there a good reason ( instance_eval &lambda_object ) can't work? Thanks for any light you can shed on it. Gavin