【问题标题】:Why does instance_eval succeed with a Proc but not with a Lambda?为什么 instance_eval 在 Proc 上成功但在 Lambda 上不成功?
【发布时间】:2013-03-08 22:34:21
【问题描述】:

我有以下课程:

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) 错误?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    instance_evalself (User) 让给 lambda。 Lambda 对它们的参数很特别 - 就像方法一样 - 如果参数太少/太多,则会引发 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?

    【讨论】:

    【解决方案2】:

    如果您仍想使用 lambda,此代码将起作用:

    block = lambda { "Hello" } # or -> { "Hello" }
    some_obj.instance_exec(&block)
    

    instance_execinstance_eval 不同,不会提供 self 作为给定块的参数,因此不会抛出 wrong number of arguments (1 for 0)

    查看here 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2021-12-22
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      相关资源
      最近更新 更多