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 Cı 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 Cı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, CıB ve B Örnek yöntemlerinin Tüm (learned_from_Adahil) uzanabilir. B hem learned_from_A çağrılabilirveCı, 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?
Sorunuzu basitleştirmenin bir yolu var mı? Hata ayıklanmış farklı senaryolarla bir gaza koymuş olsanız bile. – onebree
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. –
Aynı adı taşıyan anne ve kızı aramak istediğiniz gibi geliyor: P –