Di Ruby, saya memahami ide dasar extend
. Namun, apa yang terjadi di segmen kode ini? Secara khusus, apa yang extend
dilakukannya? Apakah ini hanya cara mudah untuk membuat metode instance menjadi metode kelas? Mengapa Anda melakukannya dengan cara ini daripada menentukan metode kelas dari awal?
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
# what does the next line do?
extend self
end
extend self
hubungannya dengan itu.Dalam sebuah modul, self adalah kelas modul itu sendiri. Jadi contohnya
akan mengembalikan Rake jadi,
pada dasarnya membuat metode instance yang ditentukan dalam Rake tersedia untuknya, jadi Anda bisa melakukannya
sumber
Bagi saya itu selalu membantu untuk memikirkan
extend
sebagaiinclude
di dalam kelas tunggal (juga dikenal sebagai kelas meta atau eigen).Anda mungkin tahu bahwa metode yang ditentukan di dalam kelas tunggal pada dasarnya adalah metode kelas:
Sekarang setelah kita mengetahuinya,
extend
akankahinclude
metode dalam modul di dalam kelas singleton dan dengan demikian mengeksposnya sebagai metode kelas:sumber
Untuk menghindari pembusukan link, postingan blog Chris Wanstrath yang ditautkan oleh user83510 di-posting ulang di bawah ini (dengan izinnya). Tetap saja, tidak ada yang mengalahkan yang asli, jadi gunakan tautannya selama itu terus berfungsi.
→ bernyanyi lajang 18 November 2008 Ada hal-hal yang tidak saya mengerti. David Bowie, misalnya. Atau Belahan Bumi Selatan. Tapi tidak ada yang cukup mengejutkan saya seperti Ruby Singleton. Karena sungguh, itu sama sekali tidak perlu.
Inilah yang mereka ingin Anda lakukan dengan kode Anda:
Tapi itu gila. Lawan kekuatan.
Ada kenapa tidak? API lebih ringkas, kodenya lebih mudah untuk diuji, dibuat-buat, dan bertopik, dan masih sangat mudah untuk diubah menjadi kelas yang tepat jika diperlukan.
((hak cipta seharusnya sepuluh chris wanstrath))
sumber
extend self
menyertakan semua metode instance yang ada sebagai metode modul. Ini sama dengan mengatakanextend Rake
. JugaRake
merupakan objek kelasModule
.Cara lain untuk mencapai perilaku yang setara adalah:
Ini dapat digunakan untuk mendefinisikan modul mandiri dengan metode privat.
sumber