考慮Ruby類Foo::Bar
。類與模塊的Ruby命名空間?
的約定是爲「富」的命名空間是一個模塊,但它可以很容易地被類:
module Foo; class Bar; end; end
對戰:
class Foo; class Bar; end; end
在第二種情況下,Bar
不是Foo
的內部類,它只是Foo
的單例中定義的另一個常量。在這兩種情況下,超類都是Object,它們只包含Kernel模塊。他們的祖先鏈是相同的。
因此,除了可以根據類使用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」中。
有趣的是,我看到有一個相關的問題中的Rails使用const_missing http://bugs.ruby-lang.org/issues/2740 – BF4