В чем преимущество этого подхода перед DigitalRoss?
Эндрю Гримм
2
Чище и точнее. Вместо того, чтобы выполнять поиск, затем использовать метод массива для разделения нежелательных символов на основе позиции (что может быть неверно).
Новая Александрия
2
Почему бы просто не использовать caller [0] [/ `(. *) '/, 1]? Я не гуру в регулярных выражениях, но, похоже, это работает.
Коллимарко
7
@collimarco До тех пор, пока String не содержит ничего, 'кроме того, что вы ищете (и я полагаю, что не может), результат будет таким же, конечно. Тем не менее, он [^']*будет работать лучше, так как движок регулярных выражений перестанет пытаться сопоставить эту часть выражения с моментом, когда он достигнет '(ваша версия будет идти до конца, а затем возвращаться назад, потому что она не нашла 'в конце). Конечно, в этом случае разница довольно незначительна, но по возможности следует избегать .регулярных выражений.
Вместо этого вы можете написать его как библиотечную функцию и сделать вызов там, где это необходимо. Код выглядит следующим образом:
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
Чтобы вызвать вышеупомянутый метод модуля, вам нужно вызвать так:
caller = CallChain.caller_method
Всегда приветствуется ссылка на потенциальное решение, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и почему оно есть. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно недоступен. Примите во внимание, что наличие чуть больше, чем ссылка на внешний сайт является возможной причиной, почему и как удаляются некоторые ответы? ,
Хави Лопес
@ XaviLópez обновил ответ, пожалуйста, исправьте, если я делаю что-то не так или что-то ошибочно ... Спасибо за любезное предложение :)
amit karsale
1
Спасибо за улучшение вашего ответа. К сожалению, я не обладаю достаточными знаниями о Ruby, чтобы правильно комментировать этот пост, но теперь ответ выглядит хорошо. Я удалил свое понижение. Удачи :-)
Хави Лопес
2
Чтобы увидеть информацию о вызывающем и вызываемом абонентах на любом языке, будь то ruby, java или python, вы всегда должны смотреть на трассировку стека. В некоторых языках, таких как Rust и C ++, в компилятор встроены опции для включения какого-либо механизма профилирования, который вы можете просматривать во время выполнения. Я верю, что существует одна для Ruby, которая называется ruby-prof.
И, как упоминалось выше, вы можете заглянуть в стек выполнения для ruby. Этот стек выполнения представляет собой массив, содержащий объекты местоположения обратной трассировки.
По сути, все, что вам нужно знать об этой команде, заключается в следующем:
вызывающая сторона (начало = 1, длина = ноль) → массив или ноль
Ответы:
или возможно ...
источник
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Я думаю, это только для Ruby.В Ruby 2.0.0 вы можете использовать:
Это намного быстрее, чем решение Ruby 1.8+:
Будут включены,
backports
когда я получу время (или запрос тянуть!).источник
caller_locations[0].label
на Ruby 2.2.0, иначе у вас всегда будетsend_action
результатИспользовать
caller_locations(1,1)[0].label
(для ruby> = 2.0)Изменить : мой ответ говорил, чтобы использовать,
__method__
но я был не прав, он возвращает имя текущего метода.источник
я использую
источник
'
кроме того, что вы ищете (и я полагаю, что не может), результат будет таким же, конечно. Тем не менее, он[^']*
будет работать лучше, так как движок регулярных выражений перестанет пытаться сопоставить эту часть выражения с моментом, когда он достигнет'
(ваша версия будет идти до конца, а затем возвращаться назад, потому что она не нашла'
в конце). Конечно, в этом случае разница довольно незначительна, но по возможности следует избегать.
регулярных выражений.Как насчет
Гораздо чище имо.
источник
Вместо этого вы можете написать его как библиотечную функцию и сделать вызов там, где это необходимо. Код выглядит следующим образом:
Чтобы вызвать вышеупомянутый метод модуля, вам нужно вызвать так:
caller = CallChain.caller_method
код ссылки от
источник
Чтобы увидеть информацию о вызывающем и вызываемом абонентах на любом языке, будь то ruby, java или python, вы всегда должны смотреть на трассировку стека. В некоторых языках, таких как Rust и C ++, в компилятор встроены опции для включения какого-либо механизма профилирования, который вы можете просматривать во время выполнения. Я верю, что существует одна для Ruby, которая называется ruby-prof.
И, как упоминалось выше, вы можете заглянуть в стек выполнения для ruby. Этот стек выполнения представляет собой массив, содержащий объекты местоположения обратной трассировки.
По сути, все, что вам нужно знать об этой команде, заключается в следующем:
вызывающая сторона (начало = 1, длина = ноль) → массив или ноль
источник