2

我有一个代码

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
4

2 回答 2

7

lambda方法在Kernel模块中定义。Object包括Kernel. BasicObject才不是。因此,如果您想lambda从 BasicObject 中使用,您必须将其称为::Kernel.lambda.

请注意,这并不特定于lambda- 它也适用于任何其他内核方法(如 eg puts)。

PS:请注意,@var1 = lambda &block这与 write 的作用相同,因此这里实际上不需要@var1 = block使用 of 。lambda

于 2013-01-11T22:18:34.617 回答
0

您使用 BasicObject 作为基类,它是一个显式的空白类,特别是不包括内核,因此当您访问任何内核方法时,您需要限定符 ::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
于 2013-01-11T23:56:14.437 回答