$0
üst düzey Ruby programı için değişken nedir, ancak geçerli yöntem için bir tane var mı?
$0
üst düzey Ruby programı için değişken nedir, ancak geçerli yöntem için bir tane var mı?
Yanıtlar:
İlk cevabımdan bile daha iyi __method__ kullanabilirsiniz:
class Foo
def test_method
__method__
end
end
Bu bir sembol döndürür - örneğin :test_method
,. Yöntem adını dize olarak döndürmek için __method__.to_s
bunun yerine arayın .
Not: Bu Ruby 1.8.7 gerektirir.
__method__.to_s
ve yöntem adı olacak, başka bir şey yok
Gönderen 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__
bunu?
Gerçekte ne istediğinize bağlı olarak , şu anda yürütülen yöntemin adını bir sembol olarak döndüren ya __method__
da __callee__
düğmelerini kullanabilirsiniz.
Yakut 1.9'da, her ikisi de aynı şekilde davranır ( dokümanlar ve testlerim söz konusu olduğunda).
Ruby 2.1 ve 2.2'de __callee__
tanımlanan yöntemin takma adını çağırırsanız farklı davranır. Docs iki farklıdır:
__method__
: "geçerli yöntemin tanımındaki ad" (yani tanımlandığı ad)__callee__
: "geçerli yöntemin adı" (yani çağrıldığı (çağrıldığı ad))Test komut dosyası:
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 Çıktı:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 Çıktı (diğer __callee__
adı __method__
döndürür , ancak yöntemin tanımlandığı noktadaki adı döndürür):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Ruby 1.9+ için kullanmanızı tavsiye ederim __callee__
__callee__
1.9'dan önce farklı davranır, bu yüzden __method__
tutarlı davranışı olduğu için uymak en iyisidir . 1.9 sonrası __callee__
olduğu gibi davranır __method__
.
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
Garip bir şey görmüyor musun?
__callee__
ve __method__
farklı bir davranış var. Bkz pastie.org/10380985 (yakut 2.1.5)
Görünüm dosyasında yöntem adını almak için aynı sorunu aldım. Çözümü aldım
params[:action] # it will return method's name
denetleyicinin adını almak istiyorsanız
params[:controller] # it will return you controller's name
super
SimpleDelegator nesnesi içinde çağrılabilir:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end