6

需要明确的是 - 此代码运行完美 -带有 proc 的代码

但是,如果我将 Proc.new 更改为 lambda,则会出现错误

ArgumentError: wrong number of arguments (1 for 0)

可能是因为 instance_eval 想将 self 作为参数传递,而 lambda 将其视为方法而不接受未知参数?

有两个例子 - 第一个是工作:

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

谢谢

4

1 回答 1

4

您的假设实际上是正确的。在被'ed时,Self 被传递给 theProc和 lambda 。instance_evalProcs 和 lambdas 之间的一个主要区别是 lambdas 检查传递给它们的块的数量。

所以:

 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 的块,正如您在参数检查中看到的那样,参数确实是selfPerson 类的实例。

于 2013-05-14T19:26:14.810 回答