Saya menemukan sebuah posting blog di alias
vs alias_method
. Seperti ditunjukkan dalam contoh yang diberikan dalam posting blog itu, saya hanya ingin alias metode lain di dalam kelas yang sama. Yang mana yang harus saya gunakan? Saya selalu melihat alias
digunakan, tetapi seseorang mengatakan kepada saya alias_method
lebih baik.
Penggunaan alias
class User
def full_name
puts "Johnnie Walker"
end
alias name full_name
end
User.new.name #=>Johnnie Walker
Penggunaan alias_method
class User
def full_name
puts "Johnnie Walker"
end
alias_method :name, :full_name
end
User.new.name #=>Johnnie Walker
alias
"ketika aliasing metode dalam lingkup kelas leksikal" danalias_method
"ketika aliasing metode modul, kelas, atau kelas singleton saat runtime" github.com/bbatsov/ruby-style-guide#alias-method-lexicallyJawaban:
alias_method
dapat didefinisikan ulang jika perlu. (Itu didefinisikan diModule
kelas.)alias
Perubahan perilaku tergantung pada ruang lingkupnya dan terkadang tidak dapat diprediksi.Putusan: Gunakan
alias_method
- itu memberi Anda lebih banyak fleksibilitas.Pemakaian:
sumber
alias :new_method_name :old_method_name
ORalias_method :new_method_name, :old_method_name
alias_method
ditentukan pada saat runtime dan bukan ketika kode dibaca, sepertialias
, sehingga lebih berperilaku seperti yang kita harapkan .def
vsdefine_method
.: "define_method
dapat didefinisikan ulang jika perlu. (Itu didefinisikan diModule
kelas.)def
'S perubahan perilaku tergantung pada ruang lingkup dan kadang-kadang bisa sangat tidak terduga. Putusan: Gunakandefine_method
- itu memberi Anda satu ton lebih banyak fleksibilitas. "Terlepas dari sintaks, perbedaan utama adalah dalam pelingkupan :
Dalam metode kasus di atas "nama" memilih metode "nama lengkap" yang didefinisikan dalam kelas "Pengembang". Sekarang mari kita coba
alias
.Dengan penggunaan alias metode "nama" tidak dapat memilih metode "nama lengkap" yang ditentukan dalam Pengembang.
Ini karena
alias
kata kunci dan cakupannya secara leksikal. Itu berarti memperlakukanself
sebagai nilai diri pada saat kode sumber dibaca. Sebaliknyaalias_method
memperlakukanself
sebagai nilai yang ditentukan pada waktu berjalan.Sumber: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
sumber
Satu hal yang lebih mendukung
alias
daripada itualias_method
adalah bahwa semantiknya diakui oleh rdoc, yang mengarah ke referensi silang yang rapi dalam dokumentasi yang dihasilkan, sementara rdoc sepenuhnya diabaikanalias_method
.sumber
alias_method
? Tampaknya sangat tidak mungkin, dan jika seseorang melakukan itu, maka mereka harus rela menanggung akibatnya di RDoc. Jika poin Anda adalah bahwa itu tidak mungkin, lalu mengapa Anda berpikir begitu dan bagaimana menurut Anda Yardoc melakukannya?Saya pikir ada aturan tidak tertulis (sesuatu seperti konvensi) yang mengatakan untuk menggunakan 'alias' hanya untuk mendaftarkan nama metode alias, berarti jika Anda ingin memberikan pengguna kode Anda satu metode dengan lebih dari satu nama:
Jika Anda perlu memperpanjang kode Anda, gunakan alternatif meta ruby.
sumber
Setahun setelah mengajukan pertanyaan, muncul artikel baru tentang masalah ini:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
Tampaknya "begitu banyak pria, begitu banyak pikiran." Dari artikel sebelumnya penulis mendorong untuk menggunakan
alias_method
, sedangkan yang terakhir menyarankan untuk menggunakanalias
.Namun ada gambaran umum dari metode ini di kedua blogpost dan jawaban di atas:
alias
ketika Anda ingin membatasi alias ke ruang lingkup di mana ia didefinisikanalias_method
untuk memungkinkan kelas yang diwarisi untuk mengaksesnyasumber
Para kontributor rubocop gem mengusulkan dalam Panduan Gaya Ruby mereka :
sumber
alias_method new_method , old_method
old_method akan dideklarasikan di kelas atau modul yang sedang diwarisi sekarang ke kelas kami di mana new_method akan digunakan.
ini bisa berupa variabel atau metode keduanya.
Misalkan Class_1 memiliki old_method, dan Class_2 dan Class_3 keduanya mewarisi Class_1.
Jika, inisialisasi Class_2 dan Class_3 dilakukan di Class_1 maka keduanya dapat memiliki nama yang berbeda di Class_2 dan Class_3 dan penggunaannya.
sumber