Byr*_*ark 5 ruby module anonymous
假设我按如下方式制作模块:
m = Module.new do
class C
end
end
Run Code Online (Sandbox Code Playgroud)
三个问题:
除了参考m,有没有办法可以访问C和内部的其他东西m?
我可以在创建匿名模块后为其命名(就像我输入"模块......")一样?
当我完成它时,如何删除匿名模块,以便它定义的常量不再存在?
三个答案:
是的,使用ObjectSpace.此代码在不引用的情况下引用c您的类:Cm
c = nil
ObjectSpace.each_object { |obj|
c = obj if (Class === obj and obj.name =~ /::C$/)
}
Run Code Online (Sandbox Code Playgroud)
当然这取决于C程序中任何地方都没有其他类,但你明白了.
是的,有点.如果你只是将它分配给一个常量,就像M = m,那么m.name将返回"M"而不是nil,并且引用M::C会起作用.实际上,当我这样做并输入M::Cirb时,我得到了#<Module:0x9ed509c>::C,但也许这是一个错误.
m或C,并且m被设置为不同的值或超出范围.如果您将其分配给常量,如上所述,则需要将其更改为不同的值(尽管通常不明智地更改常量).