Dapatkan nama metode yang sedang dijalankan

198

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

garam
sumber
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.

Mark A. Nicolosi
sumber
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
24

Dari 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
Mark A. Nicolosi
sumber
5
Ini sangat membantu saya untuk menemukan nama metode panggilan (yang bertentangan dengan saat ini).
Lambart
Tidak __callee__melakukan ini
Joshua Pinter
Solusi hebat Tandai Solusi terbaik saat ini. Great job
jonathanccalixto
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}}
Kelvin
sumber
10

Untuk Ruby 1.9+ saya sarankan menggunakan __callee__

l3x
sumber
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
Hetal Khunti
sumber
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