Forum: Ruby instance_eva()l-ing a proc with parameters

Posted by Gennady Bystritsky (Guest)
on 2006-10-02 18:37
(Received via mailing list)
Dear friends,

I need to evaluate a proc within an instance context and would like to
pass it a parameter. The only straight forward way I found is to use
instance_eval(), however it does not allow to pass parameters to a proc,
only the instance itself is passed as a single parameter:

[rh-30-x86.irvspxl08:1004]gbystrit> irb
irb(main):001:0> [ VERSION, PLATFORM ]
=> ["1.8.4", "i686-linux"]
irb(main):002:0> block = proc { |*_args| puts _args.inspect }
=> #<Proc:0xb75b21fc@(irb):2>
irb(main):003:0> class A; end
=> nil
irb(main):004:0> a = A.new
=> #<A:0xb75a9674>
irb(main):005:0> a.instance_eval &block
[#<A:0xb75a9674>]
=> nil
irb(main):006:0> a.instance_eval 1, 2, &block # Hypothetical
ArgumentError: wrong number of arguments (2 for 0)
        from (irb):6:in `instance_eval'
        from (irb):6
        from :0

Is there any easy way to do what I want? I also found that I can use
define_method() to turn a proc into an instance method and then call it
with parameters, however it involves a lot of hassle (for one,
define_method() is private).

Any thoughts?

Thank you,
Gennady Bystritsky.
Posted by Logan Capaldo (Guest)
on 2006-10-02 18:51
(Received via mailing list)
On Tue, Oct 03, 2006 at 01:35:48AM +0900, Gennady Bystritsky wrote:
> Dear friends,
> 
> I need to evaluate a proc within an instance context and would like to
> pass it a parameter. The only straight forward way I found is to use
> instance_eval(), however it does not allow to pass parameters to a proc,
> only the instance itself is passed as a single parameter:
Google for instance_exec, there are various and sundry implementations,
including one built into rails.

http://eigenclass.org/hiki.rb?instance_exec has various implementations
and their respective strengths and weaknesses. Or you can just use ruby
1.9 where it's part of the core.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.