Kami baru-baru ini memiliki masalah di mana, setelah serangkaian komitmen terjadi, proses backend gagal dijalankan. Sekarang, kami adalah anak laki-laki dan perempuan yang baik dan berlari rake test
setelah setiap check-in tetapi, karena beberapa keanehan dalam pemuatan perpustakaan Rails, itu hanya terjadi ketika kami menjalankannya langsung dari Mongrel dalam mode produksi.
Saya melacak bug dan itu karena permata Rails baru menimpa metode dalam kelas String dengan cara yang memecah satu penggunaan sempit dalam kode Rails runtime.
Ngomong-ngomong, cerita panjangnya, adakah cara, saat runtime, untuk bertanya kepada Ruby di mana suatu metode telah didefinisikan? Sesuatu seperti whereami( :foo )
itu kembali /path/to/some/file.rb line #45
? Dalam hal ini, memberi tahu saya bahwa itu didefinisikan dalam kelas String tidak akan membantu, karena itu kelebihan beban oleh beberapa perpustakaan.
Saya tidak dapat menjamin sumber hidup dalam proyek saya, jadi mencari 'def foo'
tidak akan selalu memberi saya apa yang saya butuhkan, belum lagi jika saya punya banyak def foo
, kadang-kadang saya tidak tahu sampai runtime mana yang mungkin saya gunakan.
sumber
Jawaban:
Ini benar-benar terlambat, tetapi inilah cara Anda dapat menemukan tempat metode didefinisikan:
http://gist.github.com/76951
Jika Anda menggunakan Ruby 1.9+, Anda dapat menggunakannya
source_location
Perhatikan bahwa ini tidak akan berfungsi pada semuanya, seperti kode kompilasi asli. Kelas Metode juga memiliki beberapa fungsi yang rapi, seperti pemilik Metode # yang mengembalikan file tempat metode tersebut didefinisikan.
EDIT: Juga lihat
__file__
dan__line__
dan catatan untuk REE di jawaban lain, mereka juga berguna. - wgsumber
owner
Metode2.method(:crime)
?Fixnum
method_missing
. Jadi jika Anda memiliki modul atau kelas leluhur denganclass_eval
ataudefine_method
di dalammethod_missing
, maka metode ini tidak akan berfungsi.Anda sebenarnya bisa melangkah lebih jauh dari solusi di atas. Untuk Ruby 1.8 Enterprise Edition, ada
__file__
dan__line__
metode padaMethod
instance:Untuk Ruby 1.9 dan selanjutnya, ada
source_location
(terima kasih Jonathan!):sumber
__file__
dan__line__
pada setiapMethod
kelas misalnya, ex:method(:method).__file__
.m.__file__
danm.__line__
telah diganti denganm.source_location
.Saya datang terlambat ke utas ini, dan saya terkejut bahwa tidak ada yang menyebutkan
Method#owner
.sumber
Method#parameters
.Menyalin jawaban saya dari pertanyaan serupa yang lebih baru yang menambahkan informasi baru ke masalah ini.
Ruby 1.9 memiliki metode yang disebut source_location :
Ini telah di-backport ke 1.8.7 oleh permata ini:
Jadi, Anda dapat meminta metode ini:
Dan kemudian meminta
source_location
metode itu:Ini akan mengembalikan array dengan nama file dan nomor baris. Misalnya untuk
ActiveRecord::Base#validates
pengembalian ini:Untuk kelas dan modul, Ruby tidak menawarkan dukungan bawaan, tetapi ada inti yang sangat baik di luar sana yang dibangun
source_location
untuk mengembalikan file untuk metode yang diberikan atau file pertama untuk kelas jika tidak ada metode yang ditentukan:Beraksi:
Pada Mac dengan TextMate terinstal, ini juga muncul editor di lokasi yang ditentukan.
sumber
Ini mungkin membantu tetapi Anda harus membuat kode sendiri. Disisipkan dari blog:
http://scie.nti.st/2008/9/17/making-methods-immutable-in-ruby
sumber
Jika Anda bisa crash metode, Anda akan mendapatkan backtrace yang akan memberi tahu Anda persis di mana itu.
Sayangnya, jika Anda tidak dapat menghentikannya maka Anda tidak dapat mengetahui di mana itu telah ditetapkan. Jika Anda mencoba menggunakan metode ini dengan menimpa atau menimpanya, maka setiap kerusakan akan datang dari metode Anda yang ditimpa atau diganti, dan itu tidak akan ada gunanya.
Cara-cara bermanfaat untuk metode mogok:
nil
mana ia melarangnya - banyak waktu metode ini akan menaikkanArgumentError
atau selalu adaNoMethodError
pada kelas nil.sumber
require 'ruby-debug'; debugger
kode Anda di mana Anda ingin memasukkannya .Mungkin
#source_location
bisa membantu menemukan dari mana metode ini berasal.ex:
Kembali
ATAU
Kembali
sumber
Jawaban yang sangat terlambat :) Tapi jawaban sebelumnya tidak membantu saya
sumber
nil
?nil
.»Anda mungkin dapat melakukan sesuatu seperti ini:
foo_finder.rb:
Kemudian pastikan foo_finder dimuat pertama kali dengan sesuatu seperti
(Saya hanya mengacaukan rel, jadi saya tidak tahu persis, tapi saya membayangkan ada cara untuk memulainya seperti ini.)
Ini akan menunjukkan kepada Anda semua definisi ulang dari String # foo. Dengan sedikit pemrograman meta, Anda dapat menggeneralisasi untuk fungsi apa pun yang Anda inginkan. Tapi itu perlu dimuat SEBELUM file yang benar-benar melakukan definisi ulang.
sumber
Anda selalu bisa mendapatkan backtrace dari tempat Anda berada dengan menggunakan
caller()
.sumber