2013-08-20 9 views
8

C'è un modo per ottenere l'elenco dei metodi che implementano un metodo Ruby quando viene invocato questo metodo?Come posso trovare le dipendenze del metodo Ruby?

Ad esempio:

def foo 
    puts "foo" 
end 

def foo2 
    foo 
end 

voglio sapere che quando si chiama "foo2" chiama prima "pippo" e 2 ° "mette" ed i file corrispondenti questi metodi sono definiti in. (Se "puts" chiama altri metodi, mi piacerebbe conoscerli anche io)

È possibile? e se "sì" come? Potrei dire che la mia domanda riguarda la ricerca delle dipendenze del metodo.

+2

È probabile che si caccino critiche per aver tentato di farlo; non è una responsabilità di un metodo sapere chi può chiamarla (o chi l'ha chiamata, se è per questo). Potresti voler condividere il tuo obiettivo/problema e vedere se non ci sono soluzioni più adatte e contribuire ad alleviare le preoccupazioni che qualcuno ha a proposito di aiutare a scrivere codice cattivo. :) – coreyward

+10

L'analisi del flusso di controllo statico è piuttosto difficile per un linguaggio dinamico come Ruby. –

+2

Sembra un trucco. Se hai bisogno di azioni per essere in un ordine specifico, perché non metterle nello stesso metodo in modo che sia chiaro? Forse stai facendo una domanda diversa, ma il tuo codice di esempio non chiarisce * perché * vuoi imporre un flusso statico. Hai un esempio più realistico? – jefflunt

risposta

4

È possibile ottenerlo utilizzando set_trace_func, ma poiché Ruby è dinamico, è necessario anche un codice di prova per chiamare i metodi in modo che venga stampato l'ordine di chiamata.

set_trace_func proc { |event, filename, line, id, binding, klass| puts "#{klass}##{id}" } 

In Ruby 2.0, TracePoint è un'alternativa superiore.

4

L'analisi del codice statico, in particolare quella che si desidera eseguire (elencando tutti i metodi chiamati all'interno di un metodo), è molto difficile in ruby ​​(quasi impossibile) perché la lingua è dinamica e consente tecniche di metaprogrammazione molto forti. Anche lo stesso parser non conosce i metodi richiesti fino a quando non tenta di eseguire il codice.

Esempio: chiamata eval con codice letto da un file.

+0

Quindi, suppongo che la tua risposta sia "no", non c'è modo di farlo. Posso accettarlo come una risposta, ma concediamoci un po 'più di tempo ad altri compagni per raccogliere altre possibili risposte. –

Problemi correlati