2016-06-01 7 views
0

Lassen Sie uns ein einfaches Beispiel folgende haben:Wie kann man herausfinden, von welcher Zeilennummer die Methode in Ruby aufgerufen wurde?

def funny_function(param) 
    lineNumber = __LINE__ # this gives me the current line number 
    puts lineNumber 
end 

Wie wir sehen, kann ich die aktuelle Zeilennummer erhalten. Allerdings ist meine Frage, gibt es eine nicht-intrusive Möglichkeit, um herauszufinden, aus welcher Zeile Nummer (und sogar eine Datei) die Methode aufgerufen wurde?

Nicht-intrusive Bedeutung, dass ich wissen, dass nicht die Methode Benutzer will, sie hat nur die param Parameter zu liefern, z.B .:

funny_function 'Haha' 

Vielleicht so etwas wie caller.__LINE__?

+0

Was ist falsch an der Antwort der 'caller' Methode? – spickermann

+0

'caller' gibt den aktuellen Ausführungsstapel im folgenden Format zurück:' file: line: in \ 'method''. Was stimmt damit nicht? –

+0

wollte einfach nicht es –

Antwort

1

Um die Linie der ast Funktionsaufruf zu erhalten caller[0].scan(/\d+/).first:

def func0 
    func1 
end 

def func1 
    func2 
end 


def func2 
    func3 
end 

def func3 
    p caller[0].scan(/\d+/).first 
end 

func0 
+0

mit caller_locations parse ersparen Sie von Parsing Strings. –

+0

@pascalbetz Ich wusste es nicht, ich sah deine Antwort danach, die viel besser ist. Ich habe meine Antwort einfach nicht bearbeitet, weil sie funktioniert und es gibt auch eine alternative Möglichkeit, dies zu tun. Außerdem wollte ich deine Antwort nicht paraphrasieren. – Pholochtairze

+0

Ja, die Methode wurde erst kürzlich hinzugefügt. Es wird auch gesagt, dass es leistungsfähiger ist. –

1
def b 
    puts "world" 
end 

def a 
    puts "hello" 
end 

p method(:a).source_location 
=> ["filename.rb", 5] 

Ist das, was Ihr nach?

+0

Nein, er sucht nach der Zeilennummer, an der die Methode aufgerufen wird. –

Verwandte Themen