0Pricing
Lua Academy · Pelajaran

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  50

Konstruktor 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  16

Pola 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 1

Metode 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())  -- #FF0000

Registri 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()
end

Pemeriksaan 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

  1. Class melalui Metatabel
  2. Konstruktor dan new()
  3. Metode Instans dan self
  4. Enkapsulasi dengan Closure
← Kembali ke Lua Academy