Dapatkan nama metode yang sedang dijalankan


198

$0 Apakah variabel untuk program Ruby tingkat atas, tetapi apakah ada satu untuk metode saat ini?


Satu penggunaan adalah memeriksa superdapat dipanggil dalam objek SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Kris

Jawaban:


334

Bahkan lebih baik daripada jawaban pertama saya, Anda dapat menggunakan __method__:

class Foo
  def test_method
    __method__
  end
end

Ini mengembalikan simbol - misalnya :test_method,. Untuk mengembalikan nama metode sebagai string, panggil__method__.to_s saja.

Catatan: Ini membutuhkan Ruby 1.8.7.


11
':' hanyalah simbol simbol. :) lakukan saja __method__.to_sdan itu akan menjadi nama metode, tidak ada yang lain
Lambart

Bagaimana jika saya dalam tugas menyapu?
Imran Ahmad


18

Bergantung pada apa yang sebenarnya Anda inginkan, Anda dapat menggunakan salah satu __method__atau__callee__ , yang mengembalikan nama metode yang sedang dijalankan sebagai simbol.

Pada ruby ​​1.9, keduanya berperilaku identik (sejauh dokumen dan pengujian saya).

Pada ruby ​​2.1 & 2.2 __callee__berperilaku berbeda jika Anda memanggil alias dari metode yang ditentukan. The docs untuk dua yang berbeda:

  • __method__: "nama pada definisi metode saat ini" (yaitu nama sebagaimana didefinisikan)
  • __callee__: "nama yang dipanggil dari metode saat ini" (yaitu nama yang dipanggil (dipanggil))

Skrip uji:

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 Output:

1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:orig, :method=>:orig}}

2.1.2 Output ( __callee__mengembalikan nama alias, tetapi __method__mengembalikan nama pada titik metode didefinisikan):

2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:myalias, :method=>:orig}}

10

Untuk Ruby 1.9+ saya sarankan menggunakan __callee__


3
__callee__berperilaku berbeda sebelum 1.9, jadi yang terbaik untuk tetap dengan __method__karena memiliki perilaku yang konsisten. __callee__berperilaku sama seperti __method__setelah 1.9.
Leigh McCulloch

@LeighMcCulloch dapatkah Anda menjelaskan perbedaannya dengan contoh (mungkin dalam jawaban baru)?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@CiroSantilli 六四 事件 法轮功 纳米比亚 威 视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; m2Apakah kamu tidak melihat sesuatu yang aneh?
jgburet

4
@LeighMcCulloch sebenarnya sekarang __callee__dan __method__memiliki perilaku yang berbeda. Lihat pastie.org/10380985 (ruby 2.1.5)
goodniceweb

1
pastie.org sedang down. Selamanya atau barusan?
Nakilon

-3

Saya mendapat masalah yang sama untuk mengambil nama metode dalam file tampilan. Saya mendapat solusinya

params[:action] # it will return method's name

jika Anda ingin mendapatkan nama pengontrol kemudian

params[:controller] # it will return you controller's name

4
Saya pikir Anda salah menafsirkan pertanyaan tentang tindakan pengontrol rel & metode http ... jawaban ini mungkin harus dihapus.
Factor Mystic

Berguna untuk mendapatkan nama metode (controller) yang sedang dijalankan dari tampilan.
avjaarsveld
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.