2015-11-11 5 views

Antwort

5

können Sie Kernel#caller verwenden, die den aktuellen Ausführungsstapel zurückgibt - ein Array Strings in der Form enthalten file:line oder file:line: in 'method':

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

@ falsetru Antwort ist richtig, aber ich dachte, dass ich dieses Stück Code hinzufügen würde um die verschiedenen Ergebnisse der vorgeschlagenen Methoden zu demonstrieren.

Zwei Dateien.

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 die Ausgabe ist:

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

Um zu vermeiden, dass Sie mit caller Style-Strings arbeiten müssen, können Sie stattdessen Kernel#caller_locations verwenden. Es gibt Ihnen ein Array von Thread::Backtrace::Location Objekte, die einige bequeme Methoden für Sie zur Verfügung hat.

die Dateinamen zu erhalten, in Ihrem Fall, können Sie die #path Methode verwenden:

def foo 
    caller_locations.first.path 
end 
+0

Es gibt auch eine 'absolute_path' Methode' Thema :: Backtrace :: Location', wenn Sie den vollständigen Pfad wollen zu der Datei. – ReggieB