当我阅读不同的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]
以下是我的问题:
当ruby解释器首次遇到我上面的类定义代码时,它是否会通过我编写的方法并将其存储在某处?我知道实例方法“foobar”实际上并没有运行,因为在Outerclass定义中没有调用它。
撇开第一个问题,当Ruby遇到类Innerclass时怎么样?这里发生了什么?
一般而言,您希望在课程中拥有课程的原因是什么?这样做有什么好处吗?
Outerclass的实例是否知道有关类Innerclass的任何内容?
Innerclass的实例是否知道有关类Outerclass的任何内容?
感谢您提供的任何帮助!
答案 0 :(得分:52)
当解释器通过这个文件时,它会分配这样的类:
OuterClass = Class.new do
def foobar
puts "FOOBAR"
end
InnerClass = Class.new do
def barfoo
puts "BARFOO"
end
end
end
所以当Ruby遇到嵌套类时,它会将它分配给常量InnerClass
,它被赋值给常量OuterClass
它们彼此之间没有任何关系。
InnerClass
没有继承OuterClass
:
InnerClass.ancestors
=> [InnerClass, Object, Kernel, BasicObject]
当您调用OuterClass::InnerClass
常量时,您正在引用InnerClass
常量下的OuterClass
常量,该常量等于分配给它的Class.new语句。
阅读这篇文章的好书是“Metaprogramming Ruby”。它涉及课程,单身人士,模块等的细节。
答案 1 :(得分:0)
Jörg W Mittag 在评论 Michael Papile 的回答时说得最好:
没有内部类和外部类。只有两个完全不相关的类。一个恰好被分配到另一个内部的常量命名空间。