为什么instance_eval使用Proc而不是Lambda成功?

时间:2013-03-08 22:34:22

标签: ruby

我有以下课程:

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_evalwrong number of arguments (1 for 0)错误而失败?

2 个答案:

答案 0 :(得分:16)

instance_eval正在向lambda产生selfUser)。 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了解更多信息。