2011-11-01 120 views
3

在Ruby,可以像Ruby:类中的嵌套类与嵌套类中的嵌套相同?

class A 
    class B 
    end 
end 

声明的类,然后实例内部类等A::B.new

BA有什么特别的关系(就像Java中的情况)或者是A就是它的命名空间?换句话说,在一个类中嵌套一个类就像嵌套在一个模块中一样?

回答

1

是的,它基本上与嵌套在模块中相同。嵌套类与它所嵌套的类没有任何特殊关系。

2

这是其中的一种情况,当你真的应该开启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 
+1

你的答案预期以及设计问题有兴趣在这问题可能需要考虑,但afaict不直接回答这个问题。我故意剥离了我关于特定领域的东西的问题,使其成为纯技术性的是/否问题,但我认为这仍然是本主题中的一个好答案。 – mpartel

+0

我直接回答第二句中的问题,并解释原因。尽管如此,我编辑了我的问题以包含更多关于为什么此功能更好的背景。 – coreyward

+0

我已经知道一个类可以在另一个类中定义。问题在于它的行为是否与在模块中定义的类完全相同,或者内部类是否与模块中类没有的外部类具有某种特殊关系。也许你误以为问题的第一句话是问题:)无论如何,我理解并同意你的建议。 – mpartel

0

类(和模块)有不同的用途:

  • 命名空间:当你在另一个类(或模块)中定义一个类(或模块)时,你h要在定义类之外使用不同的符号来达到内部类或模块。
  • 实例模板:模块和类的行为完全(大多数情况下)不同。
  • 继承:您可以扩展一个类,因此您可以继承其所有的用于模块的属性和方法。或者你可以包含一个模块(不是:一个类)来将它的方法(和属性)添加到你的作用域。 Ruby通过混合类层次结构中的模块来玩这里的技巧。

所以在使用名称空间的情况下,它们是相同的。然而,我会一直使用模块(仅),但这更多的是风格问题。关于这个主题的最好的书是在我看来是Paolo Perrotta的“Metaprogramming Ruby”。

+0

模块和类的行为不同,除了可以实例化一个类。 *元编程Ruby *是一本好书,但您可能想要给它另一个通读。 – coreyward

1

是和否。模块不能被实例化,而类可以被实例化,所以在模块中嵌套类与使用嵌套在类中的类存在差异。

例如:由于无法实例化模块,因此无法在此实例化福特的对象(即眼镜蛇,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`