prepend dan Resolusi Method
Rantai leluhur.
prepend dan Resolusi Method adalah pelajaran Ruby Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Ruby Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Ruby Academy mencakup 4 pelajaran total.
Rantai Leluhur
Saat Anda memanggil metode, Ruby mencari daftar yang disebut rantai leluhur. Definisi pertama yang cocok akan digunakan. Memahami rantai ini menjelaskan cara modul campuran dan pewarisan saling berinteraksi.
class Animal; end
class Dog < Animal; end
p Dog.ancestorsUrutan Pencarian Metode
Ruby pertama-tama mencari di kelas objek, lalu di modul yang disertakan, kemudian di kelas induknya, dan seterusnya menyusuri rantai sampai menemukan metode tersebut.
module M
def hello; "from module"; end
end
class C
include M
def hello; "from class"; end
end
puts C.new.helloinclude Berada di Bawah Kelas
Modul yang disertakan dengan include berada tepat di bawah kelas dalam rantai. Metode milik kelas lebih diprioritaskan daripada metode milik modul.
module M; end
class C
include M
end
p C.ancestors # [C, M, Object, ...]Mengenal Penyisipan Modul
prepend menyisipkan modul di atas kelas dalam rantai. Kini metode modul ditemukan lebih dahulu, sebelum metode milik kelas.
module M
def hello; "from module"; end
end
class C
prepend M
def hello; "from class"; end
end
puts C.new.helloPenyisipan dalam Rantai
Periksa leluhur untuk melihat bahwa prepend menempatkan modul sebelum kelas.
module M; end
class C
prepend M
end
p C.ancestors # [M, C, Object, ...]super dari Modul yang Disisipkan
Karena modul yang disisipkan dijalankan lebih dahulu, modul tersebut dapat membungkus metode kelas dengan memanggil super untuk mencapai metode aslinya. Ini sangat cocok untuk menambahkan lapisan pada perilaku.
module Logged
def save
puts "before save"
result = super
puts "after save"
result
end
end
class Record
prepend Logged
def save
puts "saving record"
:ok
end
end
p Record.new.savesuper dalam Modul Campuran
super mengikuti rantai leluhur. Dari modul yang disertakan, super mencapai kelas induk; dari modul yang disisipkan, super mencapai kelas itu sendiri.
module Polite
def greet; "Hi! " + super; end
end
class Person
prepend Polite
def greet; "I am here."; end
end
puts Person.new.greetMembungkus Tanpa Mengedit
prepend memungkinkan Anda menambahkan perilaku di sekitar metode yang sudah ada tanpa mengubah kode kelas asli, sebagai alternatif yang rapi dibandingkan modifikasi langsung pada kelas.
module Timing
def compute(n)
puts "start"
super
end
end
class Calc
prepend Timing
def compute(n); n * n; end
end
puts Calc.new.compute(5)Urutan Beberapa Modul
Jika beberapa modul disertakan, modul yang terakhir disertakan berada paling dekat dengan kelas dan dicari lebih dahulu.
module A; def who; "A"; end; end
module B; def who; "B"; end; end
class C
include A
include B
end
puts C.new.who # B wins (included last)
p C.ancestorsRingkasan Penyertaan dan Penyisipan
Perbandingan langsung:
include M: rantainya adalah[Class, M, ...]— metode kelas lebih diutamakan.prepend M: rantainya adalah[M, Class, ...]— metode modul lebih diutamakan dan dapat memanggilsuperke dalam kelas.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestorsMenyatukan Semuanya
Resolusi metode mengikuti rantai leluhur:
- Metode kelas mengungguli modul yang disertakan.
- Modul yang disisipkan mengungguli kelas.
superberjalan satu langkah ke atas dalam rantai.
module Cap
def name; super.capitalize; end
end
class User
prepend Cap
def name; "ada"; end
end
puts User.new.namePemeriksaan Singkat
Uji pemahaman Anda tentang resolusi metode.
Rangkuman
Anda telah mempelajari resolusi metode:
- Ruby mencari rantai leluhur dari atas ke bawah.
includeberada di bawah kelas;prependberada di atasnya.supermencapai definisi berikutnya di atasnya dalam rantai.prependmembungkus metode dengan rapi.
module Loud
def speak; super.upcase; end
end
class Bot
prepend Loud
def speak; "beep"; end
end
puts Bot.new.speakPertanyaan yang Sering Diajukan
Apakah pelajaran “prepend dan Resolusi Method” gratis?
Ya — teks lengkap “prepend dan Resolusi Method” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Ruby Academy, upgrade ke CoddyKit PRO. Kursus Ruby Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “prepend dan Resolusi Method”?
Rantai leluhur. Kamu berlatih Ruby Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Ruby Academy?
Tidak diperlukan pengalaman sebelumnya. Ruby Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “prepend dan Resolusi Method” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Ruby Academy ini?
Ya. Setiap pelajaran Ruby Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mendefinisikan Modul
- include dan extend
- Comparable dan Enumerable
- prepend dan Resolusi Method