类中的Ruby类(或模块中的模块)

在阅读不同的Ruby书籍时,我注意到Ruby类可以在其他Ruby类或模块中定义。 下面是一个类中的类的例子:

class Outerclass def foobar puts "FOOBAR" end class Innerclass def barfoo puts "BARFOO" end end end 

以下是我在IRB中运行的一些代码,试图从概念上理解这一点:

 oc = Outerclass.new # => #<Outerclass:0x00000100a46478> Outerclass.instance_methods(false) # => [:foobar] ic = Outerclass::Innerclass.new # => #<Outerclass::Innerclass:0x00000100a0b120> ic = Outerclass::Innerclass.instance_methods(false) # => [:barfoo] 

这是我的问题:

  1. 当ruby解释器首次遇到我的类定义代码时,是否会通过我写的方法并将其存储在某个地方? 我知道实例方法“foobar”实际上并没有运行,因为在Outerclass定义中没有对它进行调用。

  2. 捎带第一个问题,当Ruby遇到类Innerclass时呢? 这里发生了什么?

  3. 一般来说,为什么你想要在课堂上有class级,有什么原因? 这样做有什么好处吗?

  4. Outerclass的一个实例是否对类Innerclass有了解?

  5. Innerclass的一个实例是否知道类Outerclass?

感谢您可以提供的任何帮助!

当解释器正在通过这个文件时,它是这样分配类的:

 OuterClass = Class.new do def foobar puts "FOOBAR" end InnerClass = Class.new do def barfoo puts "BARFOO" end end end 

所以当Ruby遇到嵌套的类时,它将它赋值给常量的指定给常量InnerClass ,它们之间没有任何关系。

InnerClass没有inheritance到InnerClass

  InnerClass.ancestors => [InnerClass, Object, Kernel, BasicObject] 

当你调用OuterClass::InnerClass常量时,你InnerClass常量是在InnerClass下的名称空间,它等于分配给它的Class.new语句。

阅读这本书的一本好书是“rubyMetaprogramming”。 它进入类,单身,模块等细节