在Ruby,可以像Ruby:类中的嵌套类与嵌套类中的嵌套相同?
class A
class B
end
end
声明的类,然后实例内部类等A::B.new
。
B
与A
有什么特别的关系(就像Java中的情况)或者是A
就是它的命名空间?换句话说,在一个类中嵌套一个类就像嵌套在一个模块中一样?
在Ruby,可以像Ruby:类中的嵌套类与嵌套类中的嵌套相同?
class A
class B
end
end
声明的类,然后实例内部类等A::B.new
。
B
与A
有什么特别的关系(就像Java中的情况)或者是A
就是它的命名空间?换句话说,在一个类中嵌套一个类就像嵌套在一个模块中一样?
是的,它基本上与嵌套在模块中相同。嵌套类与它所嵌套的类没有任何特殊关系。
这是其中的一种情况,当你真的应该开启irb并尝试。
是的,一个类可以在另一个类中定义。由于类的超类是Module(即类扩展模块),因此它们几乎可以完成模块可以执行的任何操作。一个明显的例外是,你不能include
(混入)一个类。
这就是说,实际使用这种设计模式的理由很少。 A和B更可能被视为兄弟姐妹。除非你脸色苍白,否则不需要任意命名空间。如果您的深度超过3级,请停止并考虑重构。
这个例子更好的设计模式可能是:
module Alphabet
class A; end
class B; end
end
对于更复杂的东西,这将继续使用很好地工作混入:
module Animals
class Dog
include Walking
end
module Walking
# some methods pertaining to the ability to walk
end
end
类(和模块)有不同的用途:
所以在使用名称空间的情况下,它们是相同的。然而,我会一直使用模块(仅),但这更多的是风格问题。关于这个主题的最好的书是在我看来是Paolo Perrotta的“Metaprogramming Ruby”。
模块和类的行为不同,除了可以实例化一个类。 *元编程Ruby *是一本好书,但您可能想要给它另一个通读。 – coreyward
是和否。模块不能被实例化,而类可以被实例化,所以在模块中嵌套类与使用嵌套在类中的类存在差异。
例如:由于无法实例化模块,因此无法在此实例化福特的对象(即眼镜蛇,F-150,野马等)。
`module Ford
class Engine
...
end
end`
但是你可以有类福特的一个实例,以及福特发动机的情况下,使用嵌套类,像这样:
`class Ford
class Engine
@@actions = ['list', 'find', 'add', 'quit']
def self.actions; @@actions; end
end
def self.truck_exists?
#Some more stuff here
end
end`
你的答案预期以及设计问题有兴趣在这问题可能需要考虑,但afaict不直接回答这个问题。我故意剥离了我关于特定领域的东西的问题,使其成为纯技术性的是/否问题,但我认为这仍然是本主题中的一个好答案。 – mpartel
我直接回答第二句中的问题,并解释原因。尽管如此,我编辑了我的问题以包含更多关于为什么此功能更好的背景。 – coreyward
我已经知道一个类可以在另一个类中定义。问题在于它的行为是否与在模块中定义的类完全相同,或者内部类是否与模块中类没有的外部类具有某种特殊关系。也许你误以为问题的第一句话是问题:)无论如何,我理解并同意你的建议。 – mpartel