我有一个代码
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
答案 0 :(得分:7)
lambda
模块中定义了Kernel
方法。 Object
包括Kernel
。 BasicObject
没有。因此,如果您想使用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