2015-11-11 18 views

risposta

5

È possibile utilizzare Kernel#caller che restituisce l'esecuzione corrente stack - una matrice contenente le stringhe in forma file:line o file:line: in 'method':

def foo 
    caller[0][/[^:]+/] # OR caller[0].split(':')[0] 
end 
4

@ risposta di falsetru è corretta, ma ho pensato che vorrei aggiungere questo pezzo di codice per dimostrare i diversi risultati dei metodi proposti.

Due file.

hosting.rb

class Hosting 
    def self.foo 
    puts "__FILE__: #{__FILE__}" 
    puts "__method__: #{__method__}" 
    puts "caller: #{caller}" 
    puts "caller_locations.first.path: #{caller_locations.first.path}" 
    end 
end 

calling.rb

require_relative 'hosting' 
Hosting.foo 

On:ruby calling.rb dell'output sono:

__FILE__: /path/to/hosting.rb 
__method__: foo 
caller: ["calling.rb:2:in `<main>'"] 
caller_locations.first.path: calling.rb 
7

Per evitare di dover gestire stringhe di stile caller, è possibile utilizzare invece Kernel#caller_locations. Ti restituisce una serie di oggetti Thread::Backtrace::Location, che ha alcuni metodi convenienti disponibili per te.

Per ottenere il nome del file, nel tuo caso, è possibile utilizzare il metodo #path:

def foo 
    caller_locations.first.path 
end 
+0

C'è anche un metodo '' absolute_path' sulla Discussione :: :: Backtrace location' se si desidera che il percorso completo al file. – ReggieB

Problemi correlati