当我阅读不同的Ruby书籍时,我注意到Ruby类可以在其他Ruby类或模块中定义.以下是类中类的示例:
class Outerclass
def foobar
puts "FOOBAR"
end
class Innerclass
def barfoo
puts "BARFOO"
end
end
end
Run Code Online (Sandbox Code Playgroud)
这是我在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]
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
当ruby解释器第一次遇到我上面的类定义代码时,它是否会通过我编写的方法并将其存储在某个地方?我知道实例方法"foobar"实际上并没有运行,因为在Outerclass定义中没有调用它.
撇开第一个问题,当Ruby遇到类Innerclass时怎么样?这里发生了什么?
一般来说,为什么你想要在类中有类?这样做有什么好处吗?
Outerclass的实例是否知道有关类Innerclass的任何内容?
Innerclass的一个实例是否知道类Outerclass的任何内容?
感谢您提供的任何帮助!
Mic*_*ile 53
当解释器通过这个文件时,它会分配这样的类:
OuterClass = Class.new do
def foobar
puts "FOOBAR"
end
InnerClass = Class.new do
def barfoo
puts "BARFOO"
end
end
end
Run Code Online (Sandbox Code Playgroud)
因此,当Ruby遇到嵌套类时,它会将它InnerClass
分配给常量,该常量被赋予常量.OuterClass
它们彼此之间没有任何关系.
在InnerClass
没有继承OuterClass
:
InnerClass.ancestors
=> [InnerClass, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
当您调用OuterClass::InnerClass
常量时,您将引用在contstant InnerClass
下命名空间的OuterClass
常量,该常量等于分配给它的Class.new语句.
阅读这篇文章的好书是"Metaprogramming Ruby".它涉及课程,单身人士,模块等的细节.