2010-08-15 14 views
17

Come indicheresti i moduli che sono stati inclusi in una classe specifica in una gerarchia di classi in Ruby? Qualcosa di simile a questo:Come si elencano i moduli inclusi in una classe Ruby?

module SomeModule 
end 

class ParentModel < Object 
    include SomeModule 
end 

class ChildModel < ParentModel 
end 

p ChildModel.included_modules #=> [SomeModule] 
p ChildModel.included_modules(false) #=> [] 

Listing antenati rende il modulo di apparire più alto nella struttura:

p ChildModel.ancestors #=> [ChildModel, ParentModel, SomeModule, Object, Kernel] 

risposta

16

Per quanto ho capito la tua domanda, qualcosa di simile è quello che stai cercando:

Tuttavia, non capisco appieno i test: perché SomeModule è elencato come modulo incluso di ChildModel anche se è non è effettivamente incluso in ChildModel ma in ParentModel? E viceversa, perché è Kernelnon elencato come modulo incluso, anche se è tanto nella catena degli antenati come SomeModule? E cosa significa l'argomento booleano del metodo?

(Si noti che gli argomenti booleani sono sempre cattivo design:. Un metodo dovrebbe fare esattamente una cosa se ci vuole un argomento booleano, lo fa per definizione due cose, uno se l'argomento è vero, un altro è la l'argomento è falso oppure, se fa solo una cosa, allora può solo significare che ignora il suo argomento, nel qual caso non dovrebbe iniziare.)

+0

Non sono il poster originale, ma Penso di poter rispondere alla tua domanda: l'argomento booleano. Lance si aspetta che questo metodo '.included_modules' si comporti come' # methods', '# public_methods' e altri metodi simili in Ruby. Su questi, un valore 'true' 'significa" mostrami i metodi che questo oggetto ha ottenuto dalla sua classe IN AGGIUNTA A quelli che ha ottenuto dalle sue classi ancestrali e inclusi i moduli ". Un valore falso non restituisce questi metodi aggiuntivi. – pablobm

Problemi correlati