Yürütülmekte olan yöntemin adını alma


198

$0 üst düzey Ruby programı için değişken nedir, ancak geçerli yöntem için bir tane var mı?


Bir kullanım kontrol superSimpleDelegator nesnesi içinde çağrılabilir:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Kris

Yanıtlar:


335

İ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_sbunun yerine arayın .

Not: Bu Ruby 1.8.7 gerektirir.


11
':' sadece sembol sembolüdür. :) sadece yapmak __method__.to_sve yöntem adı olacak, başka bir şey yok
Lambart

Komisyon görevindeysem ne olur?
Imran Ahmad


19

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}}

10

Ruby 1.9+ için kullanmanızı tavsiye ederim __callee__


3
__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__.
Leigh McCulloch

@LeighMcCulloch farkı bir örnekle açıklayabilir misiniz (muhtemelen yeni bir cevapta)?
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

@CiroSantilli st 事件 法轮功 纳米比亚 威 视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; m2Garip bir şey görmüyor musun?
jgburet

4
@LeighMcCulloch aslında şimdi __callee__ve __method__farklı bir davranış var. Bkz pastie.org/10380985 (yakut 2.1.5)
goodniceweb

1
pastie.org çalışmıyor. Sonsuza dek mi yoksa şimdi mi?
Nakilon

-3

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

4
Sanırım ray denetleyicisi eylemleri ve http yöntemleri hakkında soru yanlış yorumladı ... Bu cevap muhtemelen silinmelidir.
Faktör Mystic

Geçerli olarak yürütülen (denetleyici) yöntemin adını görünümden almak için kullanışlıdır.
avjaarsveld
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.