$0
es la variable para el programa Ruby de nivel superior, pero ¿hay alguna para el método actual?
ruby
reflection
metaprogramming
corredor de sal
fuente
fuente
super
se puede llamar dentro de un objeto SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Respuestas:
Incluso mejor que mi primera respuesta, puede usar __method__:
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.
fuente
__method__.to_s
y será el nombre del método, nada másDe http://snippets.dzone.com/posts/show/2785 :
fuente
__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:
1.9.3 Salida:
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):fuente
Para Ruby 1.9+, recomendaría usar
__callee__
fuente
__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
si quieres obtener el nombre del controlador, entonces
fuente