Jaka jest przewaga tego w porównaniu z podejściem DigitalRoss?
Andrew Grimm,
2
Czystsze i dokładniejsze. Zamiast wyszukiwać, użyj metody tablicowej, aby podzielić niechciane znaki na podstawie pozycji (co może być nieprawidłowe).
Nowa Aleksandria
2
Dlaczego nie użyć po prostu caller [0] [/ `(. *) '/, 1]? Nie jestem guru w kwestii wyrażeń regularnych, ale wydaje się, że to działa.
collimarco
7
@collimarco O ile String nie zawiera '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.
Zamiast tego możesz napisać to jako funkcję biblioteczną i wykonać wywołanie w razie potrzeby. Kod wygląda następująco:
moduleCallChaindefself.caller_method(depth=1)
parse_caller(caller(depth+1).first).last
end
private
# Copied from ActionMailerdefself.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
Link do potencjalnego rozwiązania jest zawsze mile widziany, ale dodaj kontekst do niego, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego się tam znajduje. Zawsze cytuj najbardziej odpowiednią część ważnego linku, na wypadek gdyby strona docelowa była nieosiągalna lub została trwale wyłączona. Weź pod uwagę, że fakt, że niewiele więcej niż link do strony zewnętrznej jest tylko linkiem do zewnętrznej witryny, jest możliwym powodem, dlaczego i w jaki sposób niektóre odpowiedzi są usuwane? .
Xavi López
@ XaviLópez zaktualizował odpowiedź, plz napraw, jeśli robię źle lub coś pomyłkę ... dzięki za życzliwą sugestię :)
amit karsale
1
Dzięki za poprawienie odpowiedzi. Niestety, nie mam wystarczającej wiedzy o Rubim, aby móc poprawnie skomentować ten post, ale teraz odpowiedź wygląda dobrze. Usunąłem swój głos przeciw. Powodzenia :-)
Xavi López
2
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:
Odpowiedzi:
a może ...
źródło
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Myślę, że to jest tylko dla Ruby.W Ruby 2.0.0 możesz użyć:
Jest znacznie szybszy niż rozwiązanie Ruby 1.8+:
Zostanie uwzględniony,
backports
gdy otrzymam czas (lub żądanie ściągnięcia!).źródło
caller_locations[0].label
na Rubim 2.2.0, w przeciwnym razie zawsze maszsend_action
wynikUż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.źródło
używam
źródło
'
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
Znacznie czystsze imo.
źródło
Zamiast tego możesz napisać to jako funkcję biblioteczną i wykonać wywołanie w razie potrzeby. Kod wygląda następująco:
Aby uruchomić powyższą metodę modułu, musisz wywołać w ten sposób:
caller = CallChain.caller_method
odniesienie do kodu z
źródło
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
źródło