чи є спосіб у Ruby знайти ім'я виклику всередині методу?
Наприклад:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
чи є спосіб у Ruby знайти ім'я виклику всередині методу?
Наприклад:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Відповіді:
puts caller[0]
а може ...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Я думаю, це лише для Рубі.
У Ruby 2.0.0 ви можете використовувати:
caller_locations(1,1)[0].label
Це набагато швидше, ніж рішення Ruby 1.8+:
caller[0][/`([^']*)'/, 1]
Буду включатися, backports
коли я отримаю час (або запит на тягу!).
caller_locations[0].label
на Ruby 2.2.0. У вас завжди send_action
результат
Використовувати caller_locations(1,1)[0].label
(для рубіну> = 2,0)
Редагувати : у моїй відповіді було сказати, що використовувати, __method__
але я помилявся, він повертає поточну назву методу
я використовую
caller[0][/`([^']*)'/, 1]
'
більше того, що ви шукаєте (і я припускаю, що не може), результат буде точно таким же. Однак він [^']*
буде працювати краще, оскільки двигун регулярного випромінювання перестане намагатися співставити цю частину виразу в момент, коли вона досягне '
(ваша версія піде до кінця, а потім повернеться назад, тому що вона не знайшла в '
кінці). Різниця є досить незначною у цьому випадку, звичайно, але це корисна увага уникати .
регексів, де це можливо.
Натомість ви можете записати його як функцію бібліотеки та телефонувати, де потрібно. Код складається так:
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
Щоб запустити вищевказаний метод модуля, вам потрібно дзвонити так:
caller = CallChain.caller_method
Для того, щоб побачити інформацію про виклику та виклику будь-якою мовою, будь то рубін або java чи пітон, ви завжди хочете переглянути слід стека. У деяких мовах, таких як Rust і C ++, є вбудовані в компілятор параметри, щоб увімкнути якийсь механізм профілювання, який ви можете переглядати під час виконання. Я вірю, що існує для Рубі, яку називають рубіном-проф.
І як було сказано вище, ви можете заглянути в стек виконання для рубіну. Цей стек виконання - це масив, що містить об'єкти розташування заднім числом.
По суті, все, що вам потрібно знати про цю команду, полягає в наступному:
абонент (старт = 1, довжина = нуль) → масив або нуль