2009-06-10 11 views
11

Sto osservando un modulo X che contiene due moduli chiamati "InstanceMethods" e "ClassMethods"."base.send: include, InstanceMethods" ---> Che cosa fa?

L'ultima definizione nel modulo X è questo:

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

Cosa fare?

+1

io so che non è il tuo codice, ma nota che non v'è alcuna necessità di avere un modulo InstanceMethod: il modulo padre è già incluso, quindi dovremmo mettere i metodi di istanza Là. – tokland

risposta

8

included viene chiamato ogni volta che un modulo è incluso in un altro modulo o classe. In questo caso si cercherà di invocare base 'include metodo s per ottenere il modulo metodi, variabili e costanti da InstanceMethods aggiunte in base e quindi proverà a richiamare base' s extend metodo per ottenere i metodi istanza da ClassMethods aggiunto base.

Potrebbe anche essere stato

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

Ok, questo ha senso. C'è una classe W che include il modulo X, quindi l'idea è che W riceva tutti i metodi di istanza e i metodi di classe contenuti in X attraverso questi moduli. Il pezzo mancante è stato il modo in cui "incluso" viene chiamato - ma stai dicendo non appena dico "W include X", verrà chiamato il metodo incluso(). - franz 0 secondi fa – franz

+2

Esatto. Ci sono altre informazioni e un esempio amichevole su http://ruby-doc.org/core/classes/Module.html#M001683 – toholio

+9

include è un metodo privato della classe Method. quindi, base.include non funzionerà. –

0

Sta definendo un metodo di classe che accetta un parametro "base". Quindi chiama i metodi include e extend su base, passando il modulo InstanceMethods e ClassMethods come argomenti, rispettivamente. La chiamata a include aggiungerà i metodi di istanza definiti in InstanceMethods a base. Non ho familiarità con il metodo extend, ma presumo che farà qualcosa di simile, ma per i metodi di classe.

1

'invia' invoca il primo argomento come metodo sull'oggetto a cui è chiamato e il resto degli argomenti viene inviato come argomento al metodo. Quindi, in questo caso,

base.send :include, InstanceMethods 

è equivalente a

base.include(InstanceMethods) 

che aggiunge i metodi nel modulo InstanceMethods alla 'base' oggetto

+2

Non è abbastanza equivalente, dato che 'base.send: include' continuerà a chiamare include anche se il metodo è stato reso privato. 'base.include' genererà un errore. –