这是一个类
class Foo
def test_method(&c)
puts "inside test method"
c.call
end
end
现在,如果我在 block 中定义一个方法
f = Foo.new
f.test_method do
def m1
puts "inside the method m1 defined inside the block"
end
puts m1.class
end
block 的输出是NilClass
如果一个方法是在类外定义的,它就成为类 Object
内的私有(private)方法。为什么 block 内定义的方法会成为 NilClass
的一部分,而不是 Foo
类的一部分?
最佳答案
首先,m1
返回puts
的结果,即nil
。
其次,在您当前的代码中,m1
方法是为 Object
类定义的,因为默认情况下 block 保留其上下文,而不仅仅是局部变量(它始终如此) ),但也适用于“当前对象”和“当前类”。如果您希望您的定义按预期工作,您可以使用 class_eval
,它会更改 block 内的当前类(在不同的上下文中执行此 block :
class Foo
def test_method(&c)
puts 'inside test method'
self.class.class_eval(&c)
end
end
f = Foo.new
f.test_method do
def m1
# anything
end
end
Foo.instance_methods.grep(/m1/)
# => [:m1]
f.m1
# => not an error
Object.new.m1
# => NoMethodError: undefined method `m1' for #<Object:0x00000001c9b4f8>
关于ruby - block 中定义的方法属于哪个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51497766/