[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

how to do instance_eval with arguments

Jim Weirich

2/8/2006 10:34:00 PM

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

--
-- Jim Weirich

--
Posted via http://www.ruby-....


3 Answers

Yukihiro Matsumoto

2/8/2006 11:01:00 PM

0

Hi,

In message "Re: how to do instance_eval with arguments"
on Thu, 9 Feb 2006 07:33:53 +0900, Jim Weirich <jim@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.

matz.


Jim Weirich

2/9/2006 12:46:00 AM

0

Yukihiro Matsumoto wrote:
> <jim@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].

--
-- Jim Weirich

[1] http://www.catb.org/jargon/html/G/...

--
Posted via http://www.ruby-....


Jim Weirich

2/9/2006 12:50:00 AM

0

Mauricio Fernandez wrote:
> On Thu, Feb 09, 2006 at 07:33:53AM +0900, Jim Weirich wrote:
>> Any suggestions?
[...]

> One way to implement it in 1.8:

[... solution elided ...]

Thanks! That should be good enough for my prototype ... at least until
1.9 features become standard.

--
-- Jim Weirich

--
Posted via http://www.ruby-....