2008-10-14 15 views

Respuesta

256

Incluso mejor que mi primera respuesta puede utilizar __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 al __method__.to_s en su lugar.

Nota: Esto requiere Ruby 1.8.7.

+11

el ':' es solo el símbolo símbolo. :) simplemente haga '__method __. To_s' y será el nombre del método, nada más – Lambart

+0

¿Qué sucede si estoy en la tarea de rake? – Imran

19

De 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 
+4

Esto me fue muy útil para encontrar el nombre del método * calling * (a diferencia del actual). – Lambart

+0

¿'' __callee__' no hace esto? –

+0

Gran solución Marque La mejor solución en este momento. Gran trabajo – jonathanccalixto

9

para Ruby 1.9+ me gustaría recomendar el uso __callee__

+3

'__callee__' se comporta de forma diferente antes de 1.9, por lo que es mejor seguir con' __method__' ya que tiene un comportamiento constante. '__callee__' se comporta igual que' __method__' después de 1.9. –

+0

@LeighMcCulloch ¿Puedes explicar la diferencia con un ejemplo (posiblemente en una nueva respuesta)? –

+0

@CiroSantilli 视 iro def def def def def def 'def m1() puts (" aquí está el método # {__ method__}. Mi interlocutor es # {__ callee__}. ") End; def m2() puts ("aquí está el método # {__ method__}.Llamemos a m1 "); m1 end; m2' ¿No ve nada extraño? – jgburet

-2

que tiene 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 desea obtener el nombre del controlador de entonces

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

Creo que malinterpretaste la pregunta acerca de las acciones del controlador de rieles & métodos http ... esta respuesta probablemente debería ser eliminada. –

+0

Útil para obtener el nombre del método actualmente en ejecución (controlador) de la vista. – avjaarsveld

4

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

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

sobre el Ruby 2.1 2.2 & __callee__ comporta de manera diferente si se llama a un alias del método definido (ver el doc description ligeramente diferente)

escritura de la 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__ ret urnas el nombre en el punto donde se definió el método):

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