Baru mengenal Ruby dan ROR dan menyukainya setiap hari, jadi inilah pertanyaan saya karena saya tidak tahu bagaimana cara meng-google-nya (dan saya sudah mencobanya :))
kami punya metode
def foo(first_name, last_name, age, sex, is_plumber)
# some code
# error happens here
logger.error "Method has failed, here are all method arguments #{SOMETHING}"
end
Jadi apa yang saya cari cara untuk mendapatkan semua argumen diteruskan ke metode, tanpa mendaftar masing-masing. Karena ini Ruby, saya berasumsi ada cara :) jika itu adalah java saya hanya akan mencantumkannya :)
Outputnya adalah:
Method has failed, here are all method arguments {"Mario", "Super", 40, true, true}
ruby-on-rails
ruby
Haris Krajina
sumber
sumber
method(__method__).parameters.map { |_, v| [v, binding.local_variable_get(v)] }
Jawaban:
Di Ruby 1.9.2 dan yang lebih baru, Anda dapat menggunakan
parameters
metode pada suatu metode untuk mendapatkan daftar parameter untuk metode itu. Ini akan mengembalikan daftar pasangan yang menunjukkan nama parameter dan apakah itu diperlukan.misalnya
Jika kamu melakukan
kemudian
Anda dapat menggunakan variabel khusus
__method__
untuk mendapatkan nama metode saat ini. Jadi dalam suatu metode, nama parameternya dapat diperoleh melaluiAnda kemudian dapat menampilkan nama dan nilai setiap parameter dengan
Catatan: karena jawaban ini aslinya ditulis, di versi Ruby saat
eval
ini tidak bisa lagi disebut dengan simbol. Untuk mengatasi ini, sebuah eksplisitto_s
telah ditambahkan saat membangun daftar nama parameter yaituparameters.map { |arg| arg[1].to_s }
sumber
Sejak Ruby 2.1 Anda dapat menggunakan binding.local_variable_get untuk membaca nilai variabel lokal apa pun, termasuk parameter metode (argumen). Berkat itu Anda dapat meningkatkan jawaban yang diterima untuk dihindari
jahateval.sumber
Hash[method(__method__).parameters.map.collect { |_, name| [name, binding.local_variable_get(name)] }]
Salah satu cara untuk mengatasinya adalah:
sumber
Ini pertanyaan yang menarik. Mungkin menggunakan local_variables ? Tetapi harus ada cara selain menggunakan eval. Saya mencari di dokumen Kernel
sumber
eval var.to_s
. Selain itu, peringatan untuk hal ini adalah jika Anda mendefinisikan variabel lokal sebelum menjalankan loop ini, variabel tersebut akan disertakan sebagai tambahan pada parameter metode.local_variables
, ini akan mengembalikan argumen metode + semua variabel lokal. Ini dapat menyebabkan kesalahan saat kode Anda.Ini mungkin membantu ...
sumber
callers_name
penerapan yang sedikit meretas ini , Anda juga bisa meneruskan__method__
denganbinding
.Anda dapat menentukan konstanta seperti:
Dan gunakan dalam kode Anda seperti:
sumber
Sebelum saya melangkah lebih jauh, Anda menyampaikan terlalu banyak argumen ke foo. Sepertinya semua argumen tersebut adalah atribut pada Model, benar? Anda harus benar-benar melewati objek itu sendiri. Akhir pidato.
Anda bisa menggunakan argumen "percikan". Ini mendorong semuanya menjadi sebuah array. Ini akan terlihat seperti:
sumber
Jika Anda ingin mengubah tanda tangan metode, Anda dapat melakukan sesuatu seperti ini:
Atau:
Dalam hal ini, diinterpolasi
args
atauopts.values
akan menjadi sebuah array, tetapi Anda bisajoin
jika menggunakan koma. Bersulangsumber
Sepertinya apa yang ingin dicapai oleh pertanyaan ini dapat dilakukan dengan permata yang baru saja saya rilis, https://github.com/ericbeland/exception_details . Ini akan mencantumkan variabel dan variabel lokal (dan variabel instan) dari pengecualian yang diselamatkan. Mungkin layak untuk dilihat ...
sumber
better_errors
permata.Jika Anda memerlukan argumen sebagai Hash, dan Anda tidak ingin mencemari tubuh metode dengan ekstraksi parameter yang rumit, gunakan ini:
Cukup tambahkan kelas ini ke proyek Anda:
sumber
Jika fungsinya ada di dalam beberapa kelas maka Anda dapat melakukan sesuatu seperti ini:
sumber