$0
es la variable para el programa Ruby de nivel superior, pero ¿hay alguna para el método actual?
$0
es la variable para el programa Ruby de nivel superior, pero ¿hay alguna para el método actual?
Respuestas:
Incluso mejor que mi primera respuesta, puede 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 en su __method__.to_s
lugar.
Nota: Esto requiere Ruby 1.8.7.
__method__.to_s
y será el nombre del método, nada más
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
__callee__
No hace esto?
Dependiendo de lo que realmente desee, puede usar cualquiera __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 documentos y mis pruebas).
En ruby 2.1 y 2.2 se __callee__
comporta de manera diferente si llama a un alias del método definido. Los documentos para los dos son diferentes:
__method__
: "el nombre en la definición del método actual" (es decir, el nombre como se definió)__callee__
: "el nombre llamado del método actual" (es decir, el nombre como se llamó (invocado))Script 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}}
Para Ruby 1.9+, recomendaría usar __callee__
__callee__
se comporta de manera diferente antes de 1.9, por lo que es mejor seguir __method__
ya que tiene un comportamiento constante. __callee__
se comporta igual que __method__
después de 1.9.
def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2
¿No ves nada extraño?
__callee__
y __method__
tiene un comportamiento diferente. Ver pastie.org/10380985 (ruby 2.1.5)
Tengo el mismo problema para recuperar el nombre del método en el archivo de vista. Obtuve 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
super
se puede llamar dentro de un objeto SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end