Jawaban:
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.
__method__.to_s
dan itu akan menjadi nama metode, tidak ada yang lain
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
__callee__
melakukan ini
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}}
Untuk Ruby 1.9+ saya sarankan menggunakan __callee__
__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.
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
Apakah kamu tidak melihat sesuatu yang aneh?
__callee__
dan __method__
memiliki perilaku yang berbeda. Lihat pastie.org/10380985 (ruby 2.1.5)
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
super
dapat dipanggil dalam objek SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end