czy w Rubim jest sposób, aby znaleźć nazwę metody wywołującej wewnątrz metody?
Na przykład:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
czy w Rubim jest sposób, aby znaleźć nazwę metody wywołującej wewnątrz metody?
Na przykład:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Odpowiedzi:
puts caller[0]
a może ...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda". Myślę, że to jest tylko dla Ruby.
W Ruby 2.0.0 możesz użyć:
caller_locations(1,1)[0].label
Jest znacznie szybszy niż rozwiązanie Ruby 1.8+:
caller[0][/`([^']*)'/, 1]
Zostanie uwzględniony, backportsgdy otrzymam czas (lub żądanie ściągnięcia!).
caller_locations[0].labelna Rubim 2.2.0, w przeciwnym razie zawsze masz send_actionwynik
Użyj caller_locations(1,1)[0].label(dla ruby> = 2,0)
Edycja : Moja odpowiedź mówi, że należy użyć, __method__ale się myliłem, zwraca aktualną nazwę metody.
używam
caller[0][/`([^']*)'/, 1]
'poza tym, którego szukasz (i zakładam, że nie może), wynik będzie taki sam, na pewno. Jednak [^']*będzie działać lepiej, ponieważ silnik regex przestanie próbować dopasować tę część do wyrażenia w momencie, gdy osiągnie '(twoja wersja przejdzie do końca, a następnie cofnie się, ponieważ nie znalazła 'na końcu). W tym przypadku różnica jest oczywiście nieistotna, ale dobrym zwyczajem jest unikanie .wyrażeń regularnych, jeśli to możliwe.
Co powiesz na
caller[0].split("`").pop.gsub("'", "")
Znacznie czystsze imo.
Zamiast tego możesz napisać to jako funkcję biblioteczną i wykonać wywołanie w razie potrzeby. Kod wygląda następująco:
module CallChain
def self.caller_method(depth=1)
parse_caller(caller(depth+1).first).last
end
private
# Copied from ActionMailer
def self.parse_caller(at)
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
file = Regexp.last_match[1]
line = Regexp.last_match[2].to_i
method = Regexp.last_match[3]
[file, line, method]
end
end
end
Aby uruchomić powyższą metodę modułu, musisz wywołać w ten sposób:
caller = CallChain.caller_method
Aby zobaczyć informacje o dzwoniącym i wywoływanym w dowolnym języku, niezależnie od tego, czy jest to ruby, java czy python, zawsze chciałbyś spojrzeć na ślad stosu. W niektórych językach, takich jak Rust i C ++, kompilator ma wbudowane opcje włączania pewnego rodzaju mechanizmu profilowania, który można wyświetlić w czasie wykonywania. Wierzę, że dla Rubiego istnieje jeden o nazwie ruby-prof.
Jak wspomniano powyżej, możesz zajrzeć do stosu wykonywania ruby. Ten stos wykonywania jest tablicą zawierającą obiekty lokalizacji śledzenia wstecznego.
Zasadniczo wszystko, co musisz wiedzieć o tym poleceniu, jest następujące:
caller (start = 1, length = nil) → array lub nil