要清楚 - 此代码运行正常 - code with proc
但如果相反我将Proc.new更改为lambda,我收到错误
ArgumentError: wrong number of arguments (1 for 0)
可能是因为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
第二个不是:
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
由于
答案 0 :(得分:4)
你的假设实际上是正确的。自我被传递到Proc
和lambda instance_eval
。 Procs和lambdas之间的一个主要区别是lambdas检查正在传递给它们的块的arity。
所以:
class Rule
def get_rule
lambda { |s| puts s.inspect; puts name; }
end
end
class Person
attr_accessor :name
def init_rule
@name = "ruby"
instance_eval(&Rule.new.get_rule)
end
end
p = Person.new
p.init_rule
#<Person:0x007fd1099f53d0 @name="ruby">
ruby
这里我告诉lambda期望一个带有arity 1的块,正如你在参数检查中看到的那样,该参数确实是Person类的self
实例。