Konstruktor dan new()
Tuliskan fungsi konstruktor yang membuat dan menginisialisasi instans.
Konstruktor dan new() adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Tanggung Jawab Konstruktor
Konstruktor membuat dan menginisialisasi sebuah instans. Konstruktor menerima nilai awal, memvalidasinya, menetapkan nilai bawaan untuk bidang yang tidak ada, lalu mengembalikan instans baru tersebut. Konstruktor yang dirancang dengan baik memastikan setiap instans dimulai dalam keadaan yang valid.
local Player = {}
Player.__index = Player
function Player.new(name, hp, mp)
assert(type(name)=="string" and name~="","need name")
return setmetatable({
name = name,
hp = hp or 100,
mp = mp or 50,
alive = true,
items = {},
}, Player)
end
local p = Player.new("Hero")
print(p.name, p.hp, p.mp) -- Hero 100 50Konstruktor Berantai
Konstruktor berantai mengembalikan self dari metode penyetel sehingga pemanggilan metode dapat dirangkai selama proses konstruksi. Ini adalah pola pembangun dalam Lua.
local Config = {}
Config.__index = Config
function Config.new()
return setmetatable({_data={}}, Config)
end
function Config:set(k,v) self._data[k]=v; return self end
function Config:build() return self._data end
local cfg = Config.new()
:set("host","localhost")
:set("port",8080)
:set("debug",true)
:build()
print(cfg.host, cfg.port)Konstruktor Salinan
Konstruktor salinan membuat instans baru dengan nilai yang sama seperti instans yang sudah ada. Penting: gunakan salinan dangkal atau salinan mendalam, bergantung pada apakah tabel bertingkat harus dibagikan atau dibuat independen.
local function deepCopy(orig)
if type(orig)~="table" then return orig end
local copy = {}
for k,v in pairs(orig) do copy[deepCopy(k)]=deepCopy(v) end
return setmetatable(copy, getmetatable(orig))
end
local Item = {}
Item.__index = Item
function Item.new(name, stats)
return setmetatable({name=name, stats=stats or {}}, Item)
end
function Item:clone()
return deepCopy(self)
end
local sword = Item.new("Sword",{damage=50})
local clone = sword:clone()
clone.stats.damage = 30
print(sword.stats.damage) -- 50 (unchanged)Konstruktor dengan Validasi
Selalu validasi masukan konstruktor. Lemparkan galat deskriptif untuk masukan yang tidak valid pada tingkat 2 (kesalahan pemanggil). Ini menangkap bug lebih awal dan menghasilkan pesan galat yang membantu.
local Rectangle = {}
Rectangle.__index = Rectangle
function Rectangle.new(w, h)
assert(type(w)=="number" and w>0,"width must be positive number")
assert(type(h)=="number" and h>0,"height must be positive number")
return setmetatable({width=w, height=h}, Rectangle)
end
function Rectangle:area() return self.width * self.height end
function Rectangle:perimeter() return 2*(self.width+self.height) end
local r = Rectangle.new(5, 3)
print(r:area(), r:perimeter()) -- 15 16Pola Nilai Bawaan
Gunakan tabel nilai bawaan untuk menangani parameter konstruktor opsional dengan rapi. Cara ini menghindari rangkaian panjang x = x or default dan membuat nilai bawaan terlihat jelas serta mudah diubah.
local Sprite = {}
Sprite.__index = Sprite
local DEFAULTS = {x=0,y=0,rotation=0,scale=1,visible=true,alpha=1}
function Sprite.new(image, opts)
local cfg = opts or {}
local self = {image=image}
for k,v in pairs(DEFAULTS) do
self[k] = cfg[k] ~= nil and cfg[k] or v
end
return setmetatable(self, Sprite)
end
local s = Sprite.new("hero.png",{x=100,y=200})
print(s.x,s.y,s.scale) -- 100 200 1Metode Pabrik Statis
Sebuah kelas dapat memiliki beberapa metode pabrik untuk skenario pembuatan yang berbeda. Ini lebih rapi daripada membebani satu konstruktor dengan banyak parameter opsional.
local Color = {}
Color.__index = Color
function Color.fromRGB(r,g,b)
return setmetatable({r=r,g=g,b=b}, Color)
end
function Color.fromHex(hex)
hex = hex:gsub("#","")
return setmetatable({
r=tonumber(hex:sub(1,2),16),
g=tonumber(hex:sub(3,4),16),
b=tonumber(hex:sub(5,6),16),
}, Color)
end
function Color:toHex()
return string.format("#%02X%02X%02X",self.r,self.g,self.b)
end
local red = Color.fromHex("#FF0000")
print(red:toHex()) -- #FF0000Registri Konstruktor
Gunakan registri untuk melacak semua instans. Dengan demikian, Anda dapat melakukan operasi global seperti "menghancurkan semua" atau mengiterasi semua objek dari suatu tipe.
local Enemy = {}
Enemy.__index = Enemy
Enemy._all = {}
function Enemy.new(name, hp)
local self = setmetatable({name=name, hp=hp}, Enemy)
Enemy._all[#Enemy._all+1] = self
return self
end
function Enemy.destroyAll()
for _, e in ipairs(Enemy._all) do
print("Destroying:", e.name)
end
Enemy._all = {}
end
Enemy.new("Goblin",30)
Enemy.new("Orc",80)
print("Count:", #Enemy._all) -- 2
Enemy.destroyAll()Inisialisasi Malas
Beberapa bidang membutuhkan biaya komputasi besar. Gunakan __index dengan sebuah fungsi untuk menghitung dan menyimpannya saat pertama kali diakses.
local BigData = {}
BigData.__index = function(t, k)
if k == "processed" then
print("Computing processed...")
local result = {}
for i,v in ipairs(rawget(t,"raw")) do result[i]=v*2 end
rawset(t,"processed",result)
return result
end
end
function BigData.new(raw)
return setmetatable({raw=raw}, BigData)
end
local d = BigData.new({1,2,3,4,5})
print(d.processed[3]) -- Computing... 6
print(d.processed[3]) -- 6 (cached, no recompute)Prototipe dari Instans
Klon instans untuk membuat instans lain dengan nilai dasar yang sama. Klon tersebut mendapatkan metatabel yang sama (kelas yang sama) dan salinan data instans. Ini berguna untuk objek "templat".
local Unit = {}
Unit.__index = Unit
function Unit.new(t)
return setmetatable({name=t.name,hp=t.hp,atk=t.atk}, Unit)
end
function Unit:clone()
return Unit.new({name=self.name,hp=self.hp,atk=self.atk})
end
function Unit:__tostring()
return self.name.."(HP:"..self.hp..",ATK:"..self.atk..")"
end
local template = Unit.new({name="Soldier",hp=100,atk=10})
local u1 = template:clone(); u1.name="Alpha"
local u2 = template:clone(); u2.name="Beta"
print(tostring(u1),tostring(u2))Keamanan Galat Konstruktor
Jika konstruksi gagal di tengah proses (misalnya saat mengalokasikan sumber daya), pastikan tidak ada objek yang belum selesai dibuat keluar. Gunakan pcall untuk menangkap galat konstruksi dan membersihkan sumber daya jika diperlukan.
local FileHandle = {}
FileHandle.__index = FileHandle
function FileHandle.new(path, mode)
local f, err = io.open(path, mode or "r")
if not f then
return nil, "cannot open " .. path .. ": " .. err
end
return setmetatable({_f=f, path=path}, FileHandle)
end
function FileHandle:read(fmt) return self._f:read(fmt) end
function FileHandle:close() self._f:close() end
local fh, err = FileHandle.new("data.txt")
if not fh then print("Error:", err)
else print(fh:read("l")); fh:close()
endPemeriksaan Cepat
Apa peran konstruktor (new()) dalam OOP Lua?
Ringkasan: Konstruktor
Ringkasan:
- Konstruktor memvalidasi, menginisialisasi, dan memanggil setmetatable
- Gunakan tabel nilai bawaan untuk parameter opsional yang rapi
- Gunakan beberapa metode pabrik untuk skenario pembuatan yang berbeda
- Gunakan konstruktor klon untuk objek templat
- Gunakan inisialisasi malas melalui __index untuk bidang yang membutuhkan biaya komputasi besar
- Kembalikan nil+err dari konstruktor saat terjadi kegagalan (alokasi sumber daya)
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Konstruktor dan new()” gratis?
Ya — teks lengkap “Konstruktor dan new()” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Konstruktor dan new()”?
Tuliskan fungsi konstruktor yang membuat dan menginisialisasi instans. Kamu berlatih Lua 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 Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua 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 2 dari 4.
Berapa lama pelajaran “Konstruktor dan new()” 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 Lua Academy ini?
Ya. Setiap pelajaran Lua 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
- Class melalui Metatabel
- Konstruktor dan new()
- Metode Instans dan self
- Enkapsulasi dengan Closure