I'm prototyping a DSL and came across a situtation where I have a lambda that I would like to give to instance_eval, but the lambda takes arguments. Instance_eval will not supply any arguments when evaluating the lambda and I don't see a straightforward way around this.
Any suggestions?
Here's a test case ...
class Dummy def f :dummy_value end end
def instance_eval_with_args(obj, *args, &block) # Magic goes here to evaluate +block+ in the scope of # +obj+, yet pass a list of argument values to the block. end
class TestInstanceEvalWithArgs < Test::Unit::TestCase def test_instance_eval_with_args # Create a block that returns the value of an argument and a value # of a method call to +self+. This is the basic functionality I need. block = lambda { |a| [a, f] }
assert_equal [:arg_value, :dummy_value], instance_eval_with_args(Dummy.new, :arg_value, &block) end end
In message "Re: how to do instance_eval with arguments" on Thu, 9 Feb 2006 07:33:53 +0900, Jim Weirich <j...@weirichhouse.org> writes: | |I'm prototyping a DSL and came across a situtation where I have a lambda |that I would like to give to instance_eval, but the lambda takes |arguments. Instance_eval will not supply any arguments when evaluating |the lambda and I don't see a straightforward way around this. | |Any suggestions?
CVS HEAD (1.9) has instance_exec method that works exactly what you want.
Yukihiro Matsumoto wrote: > <j...@weirichhouse.org> writes: > | > |I'm prototyping a DSL and came across a situtation where I have a lambda > |that I would like to give to instance_eval, but the lambda takes > |arguments. Instance_eval will not supply any arguments when evaluating > |the lambda and I don't see a straightforward way around this. > | > |Any suggestions?
> CVS HEAD (1.9) has instance_exec method that works exactly what you > want.
Excellent! I think Matz's time machine is every bit as good as Guido's[1].