existe uma maneira no Ruby encontrar o nome do método de chamada dentro de um método?
Por exemplo:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
existe uma maneira no Ruby encontrar o nome do método de chamada dentro de um método?
Por exemplo:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Respostas:
puts caller[0]
ou talvez...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Eu acho que isso é apenas para Ruby.
No Ruby 2.0.0, você pode usar:
caller_locations(1,1)[0].label
É muito mais rápido que a solução Ruby 1.8+:
caller[0][/`([^']*)'/, 1]
Será incluído backports
quando receber a hora (ou uma solicitação de recebimento!).
caller_locations[0].label
no Ruby 2.2.0, caso contrário, você sempre terá send_action
resultado.
Use caller_locations(1,1)[0].label
(para ruby> = 2.0)
Edit : Minha resposta estava dizendo para usar, __method__
mas eu estava errado, ele retorna o nome do método atual.
eu uso
caller[0][/`([^']*)'/, 1]
'
além da que você está procurando (e presumo que não possa), o resultado será o mesmo, com certeza. No entanto, [^']*
terá um desempenho melhor, pois o mecanismo regex deixará de tentar corresponder a essa parte a expressão no momento em que atingir uma '
(sua versão será finalizada e, em seguida, retornará porque não encontrou uma '
no final). A diferença é bastante insignificante nesse caso, é claro, mas é um bom hábito evitar .
em regexes sempre que possível.
Em vez disso, você pode escrevê-lo como função de biblioteca e fazer uma chamada sempre que necessário. O código é o seguinte:
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
Para acionar o método do módulo acima, você precisa chamar assim:
caller = CallChain.caller_method
Para ver as informações do chamador e do destinatário em qualquer idioma, seja ruby, java ou python, você sempre desejaria examinar o rastreamento da pilha. Em algumas linguagens, como Rust e C ++, há opções integradas no compilador para ativar algum tipo de mecanismo de criação de perfil que você pode exibir durante o tempo de execução. Eu acredito que existe um para Ruby chamado ruby-prof.
E, como mencionado acima, você pode procurar na pilha de execução por ruby. Essa pilha de execução é uma matriz que contém objetos de localização de backtrace.
Basicamente, tudo o que você precisa saber sobre este comando é o seguinte:
chamador (início = 1, comprimento = nulo) → matriz ou nulo