当调用instance_eval(& lambda)来传递当前上下文时得到错误'错误的参数个数'

时间:2013-05-14 18:57:44

标签: ruby lambda metaprogramming

要清楚 - 此代码运行正常 - code with proc

但如果相反我将Proc.new更改为lambda,我收到错误

ArgumentError: wrong number of arguments (1 for 0)

可能是因为instance_eval希望将self作为param传递,而lambda视为一种方法而不接受未知的params?

有两个例子 - 首先是工作:

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

由于

1 个答案:

答案 0 :(得分:4)

你的假设实际上是正确的。自我被传递到Proc和lambda instance_eval。 Procs和lambdas之间的一个主要区别是lambdas检查正在传递给它们的块的arity。

所以:

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