Ruby: Obter o nome do método atual

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.

This entry was posted in Ruby. Bookmark the permalink.