考虑Ruby类Foo::Bar
。
约定是'Foo'命名空间是一个模块,但它可以很容易地成为一个类:
module Foo; class Bar; end; end
对战:
class Foo; class Bar; end; end
在第二种情况下,Bar
不是Foo
的内部类,它只是在Foo
的单例上定义的另一个常量。在这两种情况下,超类都是Object,它们只包含内核模块。他们的祖先链是相同的。
因此,除了操作之外,您可以使用Foo
进行操作,具体取决于其类(如果是类实例化,扩展/包含模块),命名空间的性质是否会对Bar
产生影响?是否有令人信服的理由选择多个名称间距而不是另一个?
我认为你可以做的唯一奇怪的事情分别是Foo::Bar.new.extend Foo
和Foo.new.class::Bar
。
我自己对类中定义的类的最常见用法是一个辅助结构/类,它只能由类在内部使用:
class Foo
Bar = Struct.new(:something) do
def digest
puts "eating #{something}"
end
end
def eat(something)
Bar.new(something).digest
end
end
我在本次讨论中找到的最接近的是“Using Class vs Module for packaging code in Ruby”。
答案 0 :(得分:5)
使用模块进行命名空间的最直接好处是可以使用include
导入命名空间,并使用其中声明的常量不合格:
module Foo; class Bar; end; end
module Elsewhere
include Foo
Bar.new
end