我有以下课程:
class User
code1 = Proc.new { }
code2 = lambda { }
define_method :test do
self.class.instance_eval &code1
self.class.instance_eval &code2
end
end
User.new.test
为什么第二个instance_eval
因wrong number of arguments (1 for 0)
错误而失败?
答案 0 :(得分:16)
instance_eval
正在向lambda产生self
(User
)。 Lambdas特别关注他们的参数 - 与方法相同 - 并且如果太少/很多则会引发ArgumentError
。
class User
code1 = Proc.new { |x| x == User } # true
code2 = lambda { |x| x == User } # true
define_method :test do
self.class.instance_eval &code1
self.class.instance_eval &code2
end
end
相关:What's the difference between a proc and a lambda in Ruby?
答案 1 :(得分:9)
如果您仍想使用lambda,此代码将起作用:
block = lambda { "Hello" } # or -> { "Hello" }
some_obj.instance_exec(&block)
与instance_exec
相反的 instance_eval
不会将self
作为参数提供给给定的块,因此不会抛出wrong number of arguments (1 for 0)
。
查看here了解更多信息。