tutorial sintaxis metodos ejecutar código codigo clase ruby reflection metaprogramming

ruby - sintaxis - Obtener el nombre del método que se está ejecutando actualmente



sintaxis de ruby (5)

$0 es la variable para el programa Ruby de nivel superior, pero ¿hay alguna para el método actual?


Dependiendo de lo que realmente desee, puede usar __method__ o __callee__ , que devuelve el nombre del método que se está ejecutando actualmente como un símbolo.

En ruby ​​1.9, ambos se comportan de manera idéntica (en lo que respecta a los docs y mis pruebas).

En ruby ​​2.1 y 2.2 __callee__ comporta de manera diferente si llama a un alias del método definido (consulte la descripción del documento ligeramente diferente)

Secuencia de comandos de prueba:

require ''pp'' puts RUBY_VERSION class Foo def orig {callee: __callee__, method: __method__} end alias_method :myalias, :orig end pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )

1.9.3 Salida:

1.9.3 {:call_orig=>{:callee=>:orig, :method=>:orig}, :call_alias=>{:callee=>:orig, :method=>:orig}}

2.1.2 Salida ( __callee__ devuelve el nombre con alias, pero __method__ devuelve el nombre en el punto en que se definió el método):

2.1.2 {:call_orig=>{:callee=>:orig, :method=>:orig}, :call_alias=>{:callee=>:myalias, :method=>:orig}}


Desde http://snippets.dzone.com/posts/show/2785 :

module Kernel private def this_method_name caller[0] =~ /`([^'']*)''/ and $1 end end class Foo def test_method this_method_name end end puts Foo.new.test_method # => test_method


Incluso mejor que mi primera respuesta, puedes usar __method__:

class Foo def test_method __method__ end end

Esto devuelve un símbolo, por ejemplo :test_method . Para devolver el nombre del método como una cadena, llame a __method__.to_s en __method__.to_s lugar.

Nota: Esto requiere Ruby 1.8.7.


Para Ruby 1.9+ recomendaría usar __callee__


Tengo el mismo problema para recuperar el nombre del método en el archivo de vista. Tengo la solución por

params[:action] # it will return method''s name

si quieres obtener el nombre del controlador, entonces

params[:controller] # it will return you controller''s name