ruby - How do I change the context of lambda? -
if run code below error.
class c def self.filter_clause param_1 puts param_1 yield # context of param class b end def hi "hello" end end class b def self.filter(value, lambda) code = lambda { filter_clause(value, &lambda) } c.instance_exec(&code) end filter(:name, ->{ hi }) end
the error
nameerror: undefined local variable or method `hi' b:class (pry):17:in `block in <class:b>'
from understanding reason lambda running under context of class b
. can't find method def hi
. can't figure out how run under context of class c
.
essentially want able inject method being called in class accepts argument , block.
for example:
filter_clause("value", ->{ hi })
is possible?
not sure if making sense.
you're close. if want lambda(/block, really) execute in context of instance of c
(since hi
instance method on c), you'll need instantiate , instance_exec block on new instance:
class c def self.filter_clause param_1, &block puts new.instance_exec &block end def hi "hello" end end class b def self.filter(value, lambda) code = lambda { filter_clause(value, &lambda) } c.instance_exec(&code) end filter(:name, ->{ hi }) end # => hello
Comments
Post a Comment