如何更改lambda的上下文?
如果您运行以下代码,则会出现错误。
class C def self.filter_clause param_1 puts param_1 yield # context of this param is 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
错误是
NameError: undefined local variable or method `hi' for B:Class from (pry):17:in `block in '
根据我的理解,原因是lambda在class B
的上下文中运行。 所以找不到方法def hi
。 我无法弄清楚如何让它在class C
的上下文中运行。
基本上我希望能够在另一个接受参数和块的类中注入一个被调用的方法。
例如:
filter_clause("value", ->{ hi })
这可能吗?
不确定我是否有意义。
你很亲密 如果你想要lambda(/ block,确实)在C
实例的上下文中执行(因为hi
是C
上的实例方法),那么你需要实例化它然后instance_exec该新实例上的块:
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
您是否反对将上下文传递到块中? 如果没有,这样的事情会起作用:
class C def self.filter_clause param_1 puts param_1 yield self 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, ->(klass){ klass.new.hi }) # "hello" end