2013-10-24 15 views
6

Ruby sınıfı Foo::Bar'u düşünün.Ruby sınıf veya modül ile ad-isim mi yapıyorsunuz?

kongre bir modül olarak 'Foo' ad alanı için, ama aynı kolaylıkla bir sınıf olabilir:

module Foo; class Bar; end; end 

Karşı: İkinci durumda

class Foo; class Bar; end; end 

, BarFoo iç sınıfı değil, sadece Foo tekilinde tanımlanan başka bir sabit. Üst sınıf, her iki durumda da Nesne'dir ve yalnızca Çekirdek modülünü içerirler. Atalarının zincirleri aynıdır.

Yani, operasyonların yanı sıra onun sınıfına bağlı Foo ile yapabiliriz (Bir sınıf,/uzatmak eğer örneğini eklerseniz bir modülü), ad niteliği Bar üzerinde herhangi bir etkisi var? Bir isimde bir çok isim aralığını seçmek için zorlayıcı nedenler var mı?

Gördüğüm tek tuhaf şeyler, sırasıyla Foo::Bar.new.extend Foo ve 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 

en yakın ben bu tartışmaya bulundu:

sınıf içerisinde tanımlanan bir sınıfın Kendi en-yaygın kullanımı sadece sınıfı tarafından dahili olarak kullanılması amaçlanan bir yardımcı yapı/sınıf olurdu "Using Class vs Module for packaging code in Ruby" içinde.

+0

İlginçtir, ben ilgili bir başka konu Rails olduğunu görmeme const_missing kullanarak http://bugs.ruby-lang.org/issues/2740 – BF4

cevap

5
için ad için modülleri kullanmanın en acil yararı ad alanı almak için include kullanın ve niteliksiz içindeki beyan sabitleri kullanabilirsiniz olmasıdır

:

module Foo; class Bar; end; end 

module Elsewhere 
    include Foo 
    Bar.new 
end 
+0

Tamam, bir modül kullanımının * karıştırılmasının amaçlandığı inandırıcı bir argüman olarak görebiliyorum. Fakat eğer amaç değilse, çoğu mücevher gibi, Gem'in üst ad alanını karıştırmak, mevcut sabitlerle çarpışmalara neden olabilir. – BF4

+0

BTW, daha fazla cevap alamıyorsam, bunu kabul ediyorum (bunu kabul ettim), ama daha eksiksiz bir şey olmasını umuyordum. – BF4

+2

Elbette, teşekkürler. Düşünebildiğim tek diğer sebepler, "sözleşmenin" ve "niyetin netleştirilmesi" dir, bunların hiçbiri bundan daha tatmin edici değil. Sınıf ve Modül, mekanik olarak o kadar yakındır çünkü Sınıf aslında gerçeklemeyi uygulayan bir Modül alt sınıfıdır. Daha önce gerçek bağımsız bir Namespace yapısının güzel olabileceğini düşündüm, ancak aslında hangi davranışı ekleyeceğinden emin değilim, bu yüzden neden şimdi Modüller ile yapıldığını anlayabiliyorum. –

İlgili konular