Bukan duplikat dari "Dapatkan nama metode yang saat ini dieksekusi di Ruby." Pertanyaan ini menanyakan nama metode panggilan, bukan nama metode saat ini.
Apa keuntungan dari pendekatan ini daripada DigitalRoss?
Andrew Grimm
2
Lebih bersih dan lebih presisi. Daripada melakukan pencarian, kemudian menggunakan metode array untuk membagi karakter yang tidak diinginkan berdasarkan posisi (yang bisa salah).
New Alexandria
2
Mengapa tidak menggunakan penelepon [0] [/ `(. *) '/, 1]? Saya bukan guru tentang ekspresi reguler, tetapi sepertinya berhasil.
collimarco
7
@collimarco Selama String tidak mengandung di 'luar yang Anda cari (dan saya anggap tidak bisa), hasilnya akan sama, tentu. Namun, [^']*akan tampil lebih baik karena mesin regex akan berhenti berusaha untuk mencocokkan bagian ekspresi saat itu mencapai '(versi Anda akan pergi ke akhir, lalu mundur karena tidak menemukan 'di akhir). Perbedaannya cukup diabaikan dalam kasus ini tentu saja, tetapi itu kebiasaan yang baik untuk dihindari .di regex jika memungkinkan.
Sebagai gantinya, Anda dapat menuliskannya sebagai fungsi perpustakaan dan melakukan panggilan di mana pun diperlukan. Kode tersebut sebagai berikut:
moduleCallChaindefself.caller_method(depth=1)
parse_caller(caller(depth+1).first).last
end
private
# Copied from ActionMailerdefself.parse_caller(at)if/^(.+?):(\d+)(?::in`(.*)')?/ =~ at
file = Regexp.last_match[1]
line = Regexp.last_match[2].to_i
method = Regexp.last_match[3]
[file, line, method]
end
end
end
Untuk memicu metode modul di atas, Anda perlu memanggil seperti ini:
caller = CallChain.caller_method
Tautan ke solusi potensial selalu diterima, tetapi harap tambahkan konteks di sekitar tautan sehingga sesama pengguna Anda akan mengetahui apa itu dan mengapa ada di sana. Selalu kutip bagian yang paling relevan dari tautan penting, jika situs target tidak dapat dijangkau atau offline secara permanen. Mempertimbangkan bahwa menjadi lebih dari sekadar tautan ke situs eksternal adalah kemungkinan alasan mengapa dan bagaimana beberapa jawaban dihapus? .
Xavi López
@ XaviLópez telah memperbarui jawabannya, tolong perbaiki jika saya melakukan kesalahan atau sesuatu yang salah ... terima kasih atas saran
baiknya
1
Terima kasih telah meningkatkan jawaban Anda. Sayangnya, saya tidak memiliki cukup pengetahuan tentang Ruby untuk dapat mengomentari posting ini dengan benar, tetapi jawabannya tampak baik-baik saja sekarang. Saya telah menghapus downvote saya. Semoga sukses :-)
Xavi López
2
Untuk melihat penelepon dan meninggalkan informasi dalam bahasa apa pun, apakah itu ruby atau java atau python, Anda selalu ingin melihat jejak stack. Dalam beberapa bahasa, seperti Rust dan C ++, ada opsi yang dibangun ke dalam kompiler untuk menyalakan semacam mekanisme profil yang dapat Anda lihat selama waktu berjalan. Saya percaya satu ada untuk Ruby yang disebut ruby-prof.
Dan seperti yang disebutkan di atas, Anda bisa melihat tumpukan eksekusi untuk ruby. Tumpukan eksekusi ini adalah array yang berisi objek lokasi jejak balik.
Pada dasarnya yang perlu Anda ketahui tentang perintah ini adalah sebagai berikut:
pemanggil (mulai = 1, panjang = nihil) → array atau nihil
Jawaban:
atau mungkin...
sumber
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Saya kira ini hanya untuk Ruby.Di Ruby 2.0.0, Anda dapat menggunakan:
Ini jauh lebih cepat daripada solusi Ruby 1.8+:
Akan disertakan
backports
saat saya mendapatkan waktu (atau permintaan tarik!).sumber
caller_locations[0].label
di Ruby 2.2.0 lagi Anda selalu memilikisend_action
hasilMenggunakan
caller_locations(1,1)[0].label
(untuk ruby> = 2.0)Sunting : Jawaban saya mengatakan untuk digunakan
__method__
tetapi saya salah, ia mengembalikan nama metode saat ini.sumber
saya menggunakan
sumber
'
luar yang Anda cari (dan saya anggap tidak bisa), hasilnya akan sama, tentu. Namun,[^']*
akan tampil lebih baik karena mesin regex akan berhenti berusaha untuk mencocokkan bagian ekspresi saat itu mencapai'
(versi Anda akan pergi ke akhir, lalu mundur karena tidak menemukan'
di akhir). Perbedaannya cukup diabaikan dalam kasus ini tentu saja, tetapi itu kebiasaan yang baik untuk dihindari.
di regex jika memungkinkan.Bagaimana tentang
Imo jauh lebih bersih.
sumber
Sebagai gantinya, Anda dapat menuliskannya sebagai fungsi perpustakaan dan melakukan panggilan di mana pun diperlukan. Kode tersebut sebagai berikut:
Untuk memicu metode modul di atas, Anda perlu memanggil seperti ini:
caller = CallChain.caller_method
referensi kode dari
sumber
Untuk melihat penelepon dan meninggalkan informasi dalam bahasa apa pun, apakah itu ruby atau java atau python, Anda selalu ingin melihat jejak stack. Dalam beberapa bahasa, seperti Rust dan C ++, ada opsi yang dibangun ke dalam kompiler untuk menyalakan semacam mekanisme profil yang dapat Anda lihat selama waktu berjalan. Saya percaya satu ada untuk Ruby yang disebut ruby-prof.
Dan seperti yang disebutkan di atas, Anda bisa melihat tumpukan eksekusi untuk ruby. Tumpukan eksekusi ini adalah array yang berisi objek lokasi jejak balik.
Pada dasarnya yang perlu Anda ketahui tentang perintah ini adalah sebagai berikut:
pemanggil (mulai = 1, panjang = nihil) → array atau nihil
sumber