当我阅读不同的 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 类的任何信息?
感谢您提供的任何帮助!
最佳答案
当解释器遍历这个文件时,它会像这样分配类:
OuterClass = Class.new do
def foobar
puts "FOOBAR"
end
InnerClass = Class.new do
def barfoo
puts "BARFOO"
end
end
end
因此,当 Ruby 遇到嵌套类时,它会将其分配给常量 InnerClass
,而常量 InnerClass
会分配给常量 OuterClass
,它们之间没有任何关系。
InnerClass
没有对 OuterClass
的继承:
InnerClass.ancestors
=> [InnerClass, Object, Kernel, BasicObject]
当您调用 OuterClass::InnerClass
常量时,您指的是在 OuterClass
常量下命名的 InnerClass
常量,它等于类.new 语句分配给它。
一本关于此的好书是“Metaprogramming Ruby”。它详细介绍了类、单例、模块等。
关于Ruby 类中的类(或模块中的模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739640/