Não é uma duplicata de "Obter o nome do método atualmente executado no Ruby". Esta pergunta pede o nome do método de chamada, não o nome do método atual.
Qual é a vantagem disso em relação à abordagem da DigitalRoss?
Andrew Grimm
2
Mais limpo e preciso. Em vez de fazer a pesquisa, use um método de matriz para dividir caracteres indesejados com base na posição (que pode estar incorreta).
New Alexandria
2
Por que não usar simplesmente o chamador [0] [/ `(. *) '/, 1]? Eu não sou um guru sobre expressões regulares, mas parece funcionar.
Collimarco
7
@ collimarco Contanto que a String não contenha uma '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:
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
Para acionar o método do módulo acima, você precisa chamar assim:
caller = CallChain.caller_method
Um link para uma solução em potencial é sempre bem-vindo, mas adicione contexto ao link para que seus colegas usuários tenham uma idéia do que é e por que está lá. Sempre cite a parte mais relevante de um link importante, caso o site de destino esteja inacessível ou fique permanentemente offline. Leve em conta que ser pouco mais que um link para um site externo é uma possível razão para Por que e como algumas respostas são excluídas? .
Xavi López
@ XaviLópez ter atualizado a resposta, plz corrigir se estou fazendo de errado ou somthing enganado ... thnx para o tipo sugestão :)
Amit karsale
1
Obrigado por melhorar sua resposta. Infelizmente, não tenho conhecimento suficiente sobre Ruby para poder comentar adequadamente sobre este post, mas a resposta parece boa agora. Eu removi meu voto negativo. Boa sorte :-)
Xavi López
2
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:
Respostas:
ou talvez...
fonte
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Eu acho que isso é apenas para Ruby.No Ruby 2.0.0, você pode usar:
É muito mais rápido que a solução Ruby 1.8+:
Será incluído
backports
quando receber a hora (ou uma solicitação de recebimento!).fonte
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.fonte
eu uso
fonte
'
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.E se
Muito mais limpo.
fonte
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:
Para acionar o método do módulo acima, você precisa chamar assim:
caller = CallChain.caller_method
referência de código de
fonte
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
fonte