Palavras-chave: Ruby, método, nome, corrente, method, current
Se você quiser saber o nome do método onde se encontra, terá que criar um outro método que quando chamado descubra o nome do método que o chamou. Assim:
class MinhaClasse def self.nome_do_metodo caller.first end def self.meu_metodo puts "Estou no método '#{nome_do_metodo}'" end end MinhaClasse.meu_metodo => Estou no método 'method_name.rb:6:in `meu_metodo''
No retorno acima, veio o nome do arquivo “method_name.rb” e logo após, o nome do método de onde imprimi a mensagem: “meu_metodo”.
Usando expressões regulares é possível filtrar essa mensagem, para torná-la mais amigável. Como Ruby permite que alteremos até as classes básicas da linguagem (dê um tiro no pé apenas se você quiser!), vamos gerar um método do Kernel para que possamos usá-lo globalmente:
module Kernel def nome_do_metodo caller.first =~ /`([^']*)'/ and $1 end end class MinhaClasse def self.meu_metodo puts "Estou no método '#{nome_do_metodo}'" end end class OutraClasse def self.meu_outro_metodo puts "Estou no método '#{nome_do_metodo}'" end end MinhaClasse.meu_metodo => Estou no método 'meu_metodo' OutraClasse.meu_outro_metodo => Estou no método 'meu_outro_metodo'
Explicando:
A chamada em caller.first retorna de onde o método foi chamado (justamente o método que queremos saber o nome), e compara com a expressão regular para ver se achou algum nome de método no final.
Ali é feito um “curto-circuito” onde é testado se a expressão regular “casou”, fazendo um and lógico com a última condição avaliada, que no caso, é $1.
Esse $1 é a primeira variável de Ruby que traz o conteúdo que “casou” da expressão regular. Se não casou, a segunda parte do and nem é avaliada e é retornado nil. Se casou, é retornada a parte que casou, que nesse caso, é o nome do método que queremos.