$0
Apakah variabel untuk program Ruby tingkat atas, tetapi apakah ada satu untuk metode saat ini?
ruby
reflection
metaprogramming
garam
sumber
sumber
super
dapat dipanggil dalam objek SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Jawaban:
Bahkan lebih baik daripada jawaban pertama saya, Anda dapat menggunakan __method__:
Ini mengembalikan simbol - misalnya
:test_method
,. Untuk mengembalikan nama metode sebagai string, panggil__method__.to_s
saja.Catatan: Ini membutuhkan Ruby 1.8.7.
sumber
__method__.to_s
dan itu akan menjadi nama metode, tidak ada yang lainDari http://snippets.dzone.com/posts/show/2785 :
sumber
__callee__
melakukan iniBergantung 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:
1.9.3 Output:
2.1.2 Output (
__callee__
mengembalikan nama alias, tetapi__method__
mengembalikan nama pada titik metode didefinisikan):sumber
Untuk Ruby 1.9+ saya sarankan menggunakan
__callee__
sumber
__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
jika Anda ingin mendapatkan nama pengontrol kemudian
sumber