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.