Forum: Ruby about lambda and its binding

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Rolando A. (Guest)
on 2008-10-17 04:40
(Received via mailing list)
is there a way to specify the binding of a proc created through lambda?

eg:

$ cat test.rb
class A
   attr_reader :foo
   def initialize
     @foo = lambda { do_that_thing }
   end
end

class B
   def do_that_thing
     puts "yeah, do it!"
   end

   def initialize
     a = A.new
     a.foo.call
   end
end

B.new

$ ruby test.rb
test.rb:4:in `initialize': undefined local variable or method
`do_that_thing' for #<A:0x127f28 
@foo=#<Proc:removed_email_address@domain.invalid:4>>
(NameError)
  from test.rb:15:in `call'
  from test.rb:15:in `initialize'
  from test.rb:19:in `new'
  from test.rb:19

So... is there a way to call the lambda defined in A with the binding
of B?
thanks a lot for any hint...
Mike G. (Guest)
on 2008-10-17 05:15
Rolando A. wrote:
>
> So... is there a way to call the lambda defined in A with the binding
> of B?
> thanks a lot for any hint...

   def initialize
     a = A.new
     instance_eval(&a.foo)
   end
Brian A. (Guest)
on 2008-10-17 10:40
(Received via mailing list)
Rolando A. <removed_email_address@domain.invalid> writes:

> end
> end
>
> B.new
>
>
> So... is there a way to call the lambda defined in A with the binding
> of B?
> thanks a lot for any hint...

Can you provide more context regarding what you're trying to
accomplish? Or are you simply wanting to learn more about Ruby's
semantics?

For example, parameterizing the lambda may do what you want more
simply:

class A
  attr_reader :foo
  def initialize
    @foo = lambda {|x| x.do_that_thing }
  end
end

class B
  def do_that_thing
    puts "yeah, do it!"
  end

  def initialize
    A.new.foo.call(self)
  end
end

B.new
Rolando A. (Guest)
on 2008-10-17 14:48
(Received via mailing list)
On 16-10-2008, at 22:15, Mike G. wrote:

> Rolando A. wrote:
>>
>> So... is there a way to call the lambda defined in A with the binding
>> of B?
>> thanks a lot for any hint...
>
>   def initialize
>     a = A.new
>     instance_eval(&a.foo)
>   end

duh... I totally forgot about instance_eval :-)
thanks!!
This topic is locked and can not be replied to.