ruby代码中未定义的方法`lambda'

时间:2013-01-11 22:15:27

标签: ruby

我有一个代码

class A < BasicObject

    def initialize var1, *args, &block
      if var1 == :lambda
        @var1 = lambda &block
      end
    end
end

a = A.new :lambda, 123  do |var|
  puts "ha ha ha"
end

为什么会导致错误?

undefined method `lambda' for #<A:0x00000001687968> (NoMethodError)

与此不同(它不会导致它)

class A
   def initialize var1, *args, &block
      if var1 == :lambda
        @var1 = lambda &block
      end
    end
end

2 个答案:

答案 0 :(得分:7)

lambda模块中定义了Kernel方法。 Object包括KernelBasicObject没有。因此,如果您想使用BasicObject中的lambda,则必须将其称为::Kernel.lambda

请注意,这不是lambda特有的 - 它也适用于任何其他内核方法(例如puts)。

PS:请注意,@var1 = lambda &block与撰写@var1 = block的做法相同,因此此处实际上并不需要使用lambda

答案 1 :(得分:0)

您使用BasicObject作为基类,它是一个显式的Blank类,特别是不包含Kernel,因此在访问任何内核方法时需要qualifier :: Kernel。

单独注意 -

您可以使用内核方法block_given而不是传递一个有块的参数吗? 以你的榜样为例 -

class A
  def initialize  *args, &block
    if block_given?
      @var1 = lambda &block
    end
    puts @var1.call
  end
end
a = A.new  123  do |var|
  puts "ha ha ha"
end