Rozważ klasę Ruby: Foo::Bar
.Wyznaczanie nazw Ruby klasą a modułem?
Konwencja jest dla przestrzeni nazw 'foo', aby być moduł, ale może równie dobrze być klasą:
module Foo; class Bar; end; end
Versus:
class Foo; class Bar; end; end
W drugim przypadku, Bar
nie jest wewnętrzną klasą Foo
, jest to po prostu kolejna stała zdefiniowana w singletonie Foo
. Nadklasa jest Object w obu przypadkach i zawierają tylko moduł Kernela. Ich łańcuchy przodków są identyczne.
Tak więc, oprócz operacji, które można wykonać przy pomocy Foo
w zależności od klasy (tworzenie instancji, jeśli klasa, rozszerzenie/uwzględnienie, jeśli moduł), czy przestrzeń nazw ma wpływ na Bar
? Czy istnieją ważne powody, aby wybrać jedną z wielu odstępów między nazwami?
Jedyne dziwne rzeczy, które widzę, to: Foo::Bar.new.extend Foo
i Foo.new.class::Bar
.
Moja własna najbardziej powszechne stosowanie klasy zdefiniowanej w klasie byłoby pomocnik struct/klasy, która ma być używana tylko wewnętrznie przez klasę:
class Foo
Bar = Struct.new(:something) do
def digest
puts "eating #{something}"
end
end
def eat(something)
Bar.new(something).digest
end
end
najbliżej znalazłem do tej dyskusji jest w "Using Class vs Module for packaging code in Ruby".
Co ciekawe, widzę tam był powiązany problem w Rails using const_missing http://bugs.ruby-lang.org/issues/2740 – BF4