要清楚 - 这段代码运行完美 - 带proc的代码
但如果相反我将Proc.new更改为lambda,我收到错误
ArgumentError: wrong number of arguments (1 for 0)
Run Code Online (Sandbox Code Playgroud)
可能是因为instance_eval希望将self作为param传递,而lambda视为一种方法并且不接受未知的params?
有两个例子 - 首先是工作:
class Rule
def get_rule
Proc.new { puts name }
end
end
class Person
attr_accessor :name
def init_rule
@name = "ruby"
instance_eval(&Rule.new.get_rule)
end
end
Run Code Online (Sandbox Code Playgroud)
第二个不是:
class Rule
def get_rule
lambda { puts name }
end
end
class Person
attr_accessor :name
def init_rule
@name = "ruby"
instance_eval(&Rule.new.get_rule)
end
end
Run Code Online (Sandbox Code Playgroud)
谢谢
假设我在最顶层有以下ruby定义
callable = lambda {"#{hi}"}
Run Code Online (Sandbox Code Playgroud)
并且假设稍后我创建了一个名为的对象temp,它有一个名为的方法hi.现在我想做的是callable在上下文中调用temp.我试过了
temp.instance_eval do callable.call end
Run Code Online (Sandbox Code Playgroud)
但这给了我错误" NameError: undefined local variable or method 'hi' for main:Object".我想知道是否有任何方式重新绑定的情况下callable,以temp使我没有得到一个错误信息?我知道我可以method_missing在main上定义:对象并重新路由所有方法调用,temp但这看起来像是一个太大的黑客来完成我想要的东西.