使用Ruby中的匿名模块

Byr*_*ark 5 ruby module anonymous

假设我按如下方式制作模块:

m = Module.new do
  class C
  end
end
Run Code Online (Sandbox Code Playgroud)

三个问题:

  • 除了参考m,有没有办法可以访问C和内部的其他东西m

  • 我可以在创建匿名模块后为其命名(就像我输入"模块......")一样?

  • 当我完成它时,如何删除匿名模块,以便它定义的常量不再存在?

wde*_*aum 7

三个答案:

  • 是的,使用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,但也许这是一个错误.

  • 我认为它应该被垃圾收集一次有对它的引用,即当没有实例或亚型mC,并且m被设置为不同的值或超出范围.如果您将其分配给常量,如上所述,则需要将其更改为不同的值(尽管通常不明智地更改常量).