Betrachten Sie die Ruby-Klasse Foo::Bar
.Ruby Namespace mit einer Klasse vs. Modul?
Die Konvention ist für den Namespace 'Foo' ein Modul zu sein, aber es könnte genauso gut eine Klasse sein:
module Foo; class Bar; end; end
Versus:
class Foo; class Bar; end; end
Im zweiten Fall, Bar
ist keine innere Klasse von Foo
, es ist nur eine weitere Konstante, die auf dem Singleton von Foo
definiert ist. Die Oberklasse ist in beiden Fällen Object und sie enthalten nur das Kernel-Modul. Ihre Vorfahrenketten sind identisch.
Also, neben Operationen, die Sie mit Foo
abhängig von seiner Klasse machen können (instanziieren, wenn eine Klasse, erweitern/include wenn ein Modul), hat die Art des Namespace irgendwelche Auswirkungen auf Bar
? Gibt es zwingende Gründe, einen Namen mit vielen Namen zu wählen?
Die einzigen seltsamen Dinge, die ich sehe, sind Foo::Bar.new.extend Foo
bzw. Foo.new.class::Bar
.
Meine eigene meistverbreitete Verwendung einer Klasse in einer Klasse definiert würde eine Helfer-Struktur/Klasse sein, die nur gemeint wird intern von der Klasse verwendet werden sollten:
class Foo
Bar = Struct.new(:something) do
def digest
puts "eating #{something}"
end
end
def eat(something)
Bar.new(something).digest
end
end
Die nächstgelegene ich zu dieser Diskussion gefunden ist in "Using Class vs Module for packaging code in Ruby".
Interessanterweise sehe ich ein ähnliches Problem in Rails war const_missing http://bugs.ruby-lang.org/issues/2740 – BF4