2015-11-21 20 views
8

modüllerini genişletiyor/genişletiyor Modüllerin nasıl genişlediğini ve birbirlerini nasıl içerdiğini daha iyi anlamaya çalışıyorum.Ruby: Modüller

module B 
    extend A 
end 

B.learned_from_A # true 

Ben safça her şeyi B etti vermek girişiminde:

module A 
    def learned_from_A 
    true 
    end 
end 

A.instance_methods # [:learned_from_A] 

Ben B içine hileler onun çantasını karıştırıp:

Ben modülü A var ki :

Sanırım kafamı bunun etrafına sardım.

B.singleton_methods # [:learned_from_A] 

ederken: BA uzandığında, A'nın Örnek yöntemlerinin kopyaları B'nin tekil sınıfının aracılığı B bağlanmıştır learned_from_AB üzerinde çağrılabilir, bu B biri değil sitesindeki örneği yöntemleri, böylece B, uzandığında: learned_from_A, C'a kopyalanmış numaralı sayılı belgedir.


B ise yerine A, A'nın Örnek yöntemlerinin kopyaları B'nin kendi örneği yöntemleri arasında yer oldum olacak dahil oldu. C kopyalanabilir olur ve bağlı:

module B 
    include A 
end 

B.instance_methods # [:learned_from_A] 

Daha sonra, B ve B Örnek yöntemlerinin Tüm (learned_from_Adahil) uzanabilir. B hem learned_from_A çağrılabilirve, B uzanabilir ve birşunlardır:

module C 
    extend B 
end 

C.singleton_methods # [:learned_from_A] 

yapmak için.

module B 
    include A 
    extend A 
end 

B.instance_methods # [:learned_from_A] 
B.singleton_methods # [:learned_from_A] 

module C 
    extend B 
end 

C.instance_methods # [] 
C.singleton_methods # [:learned_from_A] 

Ben A 'ın yöntemleri B üzerinde çağrılabilir olmasını istiyorsanız Daha gerçekçi

, ve B için ve karıştırmak mümkün, kendine ait başka bir yöntemi tanımlamak için C içine bütün repertuarı, ben bunu yapamam:

module B 
    extend A 
    include A 

    def self.buzz 
    true 
    end 
end 

module C 
    extend B 
end 

B yalnızca kendi yöntemlerini değil, tekil yöntemlerini paylaşabilir. Yani B üzerinde çağrılabilir ve diğer nesnelere paylaşılabilir hem bir yöntem yapmak için, bu B kendisine örnek yöntemi olarak tanımlanmış ve uzatılmalıdır:


module B 
    extend A 
    include A 

    extend self 

    def buzz 
    true 
    end 
end 

module C 
    extend B 
end 
deneme adil bir miktar oldu ve hepsini bir araya getirme hatası. Neler olup bittiğini görmenin doğru bir yolu mu?

+0

Sorunuzu basitleştirmenin bir yolu var mı? Hata ayıklanmış farklı senaryolarla bir gaza koymuş olsanız bile. – onebree

+0

Sanırım B'nin içine doğru uzandığınızda benliğin kapsam değişimini karıştırıyor olabilirsiniz ve sonra bu C'nin A'ya sahip olmasını bekleyebilirsiniz. Kapsamı değiştirirsiniz. Ayrıca çağrılabilir #prepend vardır. Bu kapsamların nasıl değiştiğini görmek için sınıfınızdaki $ ataşları yöntemini çağırın. –

+1

Aynı adı taşıyan anne ve kızı aramak istediğiniz gibi geliyor: P –

cevap