2009-06-10 17 views
11

"InstanceMethods" ve "ClassMethods" adlı iki modülden oluşan bir X modülüne bakıyorum."base.send: include, InstanceMethods" ---> Bu ne yapar?

def self.included(base) 
    base.send :include, InstanceMethods 
    base.send :extend, ClassMethods 
    end 

bu ne işe yarar:

modül X son tanım şudur?

+1

Ben kodunuzu olmadığını biliyorum ama bir InstanceMethod modülüne sahip gerek yoktur olduğuna dikkat: Üst modül zaten dahil ediliyor, bu yüzden örnek yöntemleri koymalıyız Orada. – tokland

cevap

8

included için InstanceMethods modülünde yöntemler ekleyen

base.include(InstanceMethods) 

çağrılan eşdeğerdir, bu durumda Yani bir modül başka içine dahil edilir zaman modül veya sınıf. Bu durumda, bu base çağırmak çalışacaktır 'InstanceMethods modül yöntemleri, değişkenler ve sabitler elde etmek için in include yöntem base içine ilave edildi ve daha sonra base çağırmak çalışacaktır' ClassMethodsbase ilave den örnek yöntemleri elde etmek için in extend yöntem.

Ayrıca olabilirdi

def self.included(base) 
    base.include(InstanceMethods) 
    base.extend(ClassMethods) 
end 
+1

Tamam, bu mantıklı. X modülünü içeren bir W sınıfı vardır, bu yüzden W, bu modüller yoluyla X'in içerdiği tüm örnek yöntemleri ve sınıf yöntemlerini alır. Eksik parça 'dahil' olarak adlandırılıyordu - ama "W include X" dediğimde hemen söylüyorsunuz, include() yöntemi çağrılacak. - franz 0 saniye önce – franz

+2

Doğru. Http://ruby-doc.org/core/classes/Module.html#M001683 – toholio

+9

adresinde daha fazla bilgi ve kolay bir örnek, Method sınıfının özel bir yöntemidir. Bu nedenle, base.include çalışmayacak. –

0

"base" parametresini alan bir sınıf yöntemi tanımlamak. Ardından, InstanceMethods modülünü ve ClassMethods10 modülünü geçirerek include ve extend yöntemlerini base numaralı telefona çağırır. include numaralı çağrı, InstanceMethods'da tanımlanan örnek yöntemlerini base'a ekler. Ben extend yöntemine aşina değilim, ama bunun gibi bir şey yapacağını varsayalım, ama sınıf yöntemleri için.

1

'Gönder', ilk argümanını çağrılan nesnede bir yöntem olarak çağırır ve argümanların geri kalanı yönteme argüman olarak gönderilir.

base.send :include, InstanceMethods 

'baz' nesne

+2

Oldukça eşdeğerli değil, çünkü base.send: include', yöntem özel yapılmış olsa bile yine de çağrıya devam edecektir. base.include' bir hata verecek. –