Ruby命名空间与类和模块?

时间:2013-10-24 18:59:34

标签: ruby

考虑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 FooFoo.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”。

1 个答案:

答案 0 :(得分:5)

使用模块进行命名空间的最直接好处是可以使用include导入命名空间,并使用其中声明的常量不合格:

module Foo; class Bar; end; end

module Elsewhere
  include Foo
  Bar.new
end