11

我有以下课程:

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

4

2 回答 2

17

instance_evalself将( )屈服于Userlambda。Lambda 对它们的参数很特别 - 与方法相同 -ArgumentError如果参数太少/太多,则会引发 an 。

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

相关:Ruby 中的 proc 和 lambda 有什么区别?

于 2013-03-08T22:51:59.553 回答
12

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

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

instance_exec相反,instance_eval不会self作为给定块的参数提供,因此wrong number of arguments (1 for 0)不会被抛出。

在这里查看更多信息。

于 2016-03-31T13:31:30.887 回答