About lambda and its binding


#1

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 methoddo_that_thing’ for #<A:0x127f28 @foo=#Proc:removed_email_address@domain.invalid:4>
(NameError)
from test.rb:15:in call' from test.rb:15:ininitialize’
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…


#2

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


#3

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


#4

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 :slight_smile:
thanks!!