$0
è la variabile per il programma Ruby di livello superiore, ma ce n'è una per il metodo attuale?
$0
è la variabile per il programma Ruby di livello superiore, ma ce n'è una per il metodo attuale?
Risposte:
Anche meglio della mia prima risposta puoi usare __method__:
class Foo
def test_method
__method__
end
end
Ciò restituisce un simbolo, ad esempio :test_method
. Per restituire il nome del metodo come stringa, chiamare __method__.to_s
invece.
Nota: questo richiede Ruby 1.8.7.
__method__.to_s
e sarà il nome del metodo, nient'altro
Da 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__
lo fa?
A seconda di ciò che si desidera effettivamente, è possibile utilizzare __method__
o__callee__
, che restituisce il simbolo del metodo attualmente in esecuzione come simbolo.
Su ruby 1.9, entrambi si comportano in modo identico (per quanto riguarda i documenti e i miei test).
Su ruby 2.1 e 2.2 __callee__
si comporta diversamente se si chiama un alias del metodo definito. I documenti per i due sono diversi:
__method__
: "il nome alla definizione del metodo corrente" (ovvero il nome così come è stato definito)__callee__
: "il nome chiamato del metodo corrente" (ovvero il nome come è stato chiamato (invocato))Script di prova:
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 Uscita:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 Output ( __callee__
restituisce il nome con alias, ma __method__
restituisce il nome nel punto in cui è stato definito il metodo):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Per Ruby 1.9+ consiglierei di usare __callee__
__callee__
si comporta in modo diverso prima di 1.9, quindi è meglio attenersi __method__
poiché ha un comportamento coerente. __callee__
si comporta come __method__
dopo 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
Non vedi niente di strano?
__callee__
e __method__
ha un comportamento diverso. Vedi pastie.org/10380985 (ruby 2.1.5)
Ho avuto lo stesso problema per recuperare il nome del metodo nel file di visualizzazione. Ho ottenuto la soluzione
params[:action] # it will return method's name
se vuoi ottenere il nome del controller allora
params[:controller] # it will return you controller's name
super
può essere chiamato all'interno di un oggetto SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end