Menghubungkan dengan __index
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 7 dari 70.
Kamu memiliki tabel prototipe dengan property dan method, tetapi bagaimana cara membuat object baru benar-benar menggunakannya? Jawabannya terletak pada metamethod __index.
Saat kamu mengakses kunci yang tidak ada di tabel, Lua biasanya mengembalikan nil. Namun, jika tabel tersebut memiliki metatable dengan field __index, Lua akan mencari di sana. Dengan mengatur __index agar menunjuk ke prototipemu, kunci yang hilang akan ditemukan secara otomatis di prototipe:
local Dog = {
species = "Canis familiaris",
legs = 4
}
function Dog:bark()
print("Woof!")
end
-- Buat instance kosong
local myDog = {}
-- Hubungkan ke prototipe
setmetatable(myDog, { __index = Dog })
print(myDog.species) -- output: Canis familiaris
myDog:bark() -- output: Woof!Tabel myDog sepenuhnya kosong, tetapi mengakses myDog.species tetap berfungsi. Saat Lua tidak menemukan species di myDog, Lua memeriksa __index milik metatable dan menemukannya di Dog.
Ini adalah dasar pemrograman berorientasi object di Lua. Instance dapat memiliki data uniknya sendiri, sementara perilaku bersama berada di prototype. Pada pelajaran berikutnya, kamu akan belajar cara membungkus pola ini menjadi fungsi konstruktor yang rapi.
Tantangan
MudahSekarang, mari praktikkan metamethod __index! Kamu akan membuat prototype dan menghubungkan sebuah instance dengannya, sehingga instance tersebut dapat mengakses property dan method yang tidak dimilikinya secara langsung.
Kamu akan menyusun kodemu dalam dua file:
Robot.lua: Definisikan tabel prototypeRobotdengan:- Field
modelyang nilainya ditetapkan ke"RX-100" - Field
batteryLevelyang nilainya ditetapkan ke100 - Method
:status()yang mencetak status robot saat ini
- Field
main.lua: Wajibkan module Robot, lalu buat tabel instance kosong dan hubungkan dengan prototype Robot menggunakansetmetatabledengan__index. Ini memungkinkan instance kosongmu mengakses semua hal dari prototype.
Kamu akan menerima satu input: nama untuk diberikan ke instance robotmu.
Setelah menghubungkan instance dengan prototype:
- Tetapkan nama input ke field
namepada instance-mu. Nama ini menjadi unik untuk instance tersebut. - Panggil method
:status()pada instance-mu.
Method :status() harus mencetak dengan format persis berikut:
[name] ([model]) - Battery: [batteryLevel]%Misalnya, jika input-nya adalah Sparky, output-nya harus berupa:
Sparky (RX-100) - Battery: 100%Perhatikan bahwa instance memiliki name sendiri, tetapi mengakses model dan batteryLevel dari prototype melalui tautan __index.
Coba sendiri
-- Baca input
local name = io.read()
-- Muat module Robot dengan require
local Robot = require('Robot')
-- TODO: Buat tabel instance kosong
-- TODO: Hubungkan instance ke prototipe Robot menggunakan setmetatable dengan __index
-- TODO: Tetapkan nama dari input ke field name pada instance-mu
-- TODO: Panggil method :status() pada instance-mu
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online