Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Sekarang, 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 prototype Robot dengan:
    • Field model yang nilainya ditetapkan ke "RX-100"
    • Field batteryLevel yang nilainya ditetapkan ke 100
    • Method :status() yang mencetak status robot saat ini
    Kembalikan tabel tersebut di akhir file.
  • main.lua: Wajibkan module Robot, lalu buat tabel instance kosong dan hubungkan dengan prototype Robot menggunakan setmetatable dengan __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:

  1. Tetapkan nama input ke field name pada instance-mu. Nama ini menjadi unik untuk instance tersebut.
  2. 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
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler Lua online