Menu
CoddyTech

Variabel Instans

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 12 dari 70.

Selamat datang di bab baru yang berfokus pada cara object mengelola data internalnya. Kamu telah belajar membuat class dan instance: sekarang saatnya menjelajahi cara setiap instance menyimpan dan mengelola state uniknya sendiri.

Variabel instans adalah field yang hanya dimiliki oleh satu object. Saat kamu menetapkan nilai ke self.something di dalam method atau constructor, data itu hanya ada di instans tersebut. Object lain dari class yang sama memiliki salinannya sendiri secara terpisah.

Hal ini menjadi sangat penting saat menyimpan data kompleks seperti tabel. Pertimbangkan sistem inventaris yang setiap karakternya membawa item yang berbeda:

local Inventory = {}
Inventory.__index = Inventory

function Inventory:new()
    local instance = {}
    setmetatable(instance, self)
    instance.items = {}  -- Setiap instance memiliki tabel kosongnya sendiri
    return instance
end

function Inventory:addItem(item)
    table.insert(self.items, item)
end

Baris kuncinya adalah instance.items = {}. Dengan membuat tabel kosong baru di dalam constructor, setiap object inventaris menerima list tersendiri yang berbeda. Jika kamu justru mendefinisikan items di tabel class itu sendiri, semua instance akan tanpa sengaja berbagi tabel yang sama: menambahkan pedang ke satu karakter akan memberikannya kepada semua orang!

local bag1 = Inventory:new()
local bag2 = Inventory:new()

bag1:addItem("Sword")
bag2:addItem("Potion")

print(#bag1.items)  -- output: 1
print(#bag2.items)  -- output: 1

Setiap inventaris memiliki koleksinya sendiri. Pola ini berlaku setiap kali sebuah instance perlu melacak data yang berubah secara mandiri: list, penghitung, atau status yang dapat diubah dan unik untuk object tersebut.

challenge icon

Tantangan

Mudah

Mari kita buat sistem ShoppingCart yang setiap cart-nya memiliki list produk tersendiri. Ini akan menunjukkan bagaimana variabel instance menjaga data tetap terpisah di antara object: menambahkan item ke satu cart tidak akan memengaruhi cart lainnya!

Kamu akan menyusun kodemu dalam dua file:

  • ShoppingCart.lua: Definisikan class ShoppingCart yang setiap instance-nya memiliki tabel products sendiri. Sertakan:
    • Constructor :new() yang menginisialisasi list produk kosong untuk setiap cart
    • Method :addProduct(productName) yang menambahkan produk ke list cart ini
    • Method :listProducts() yang mencetak setiap produk pada baris terpisah
  • main.lua: Muat module ShoppingCart dan buat dua cart terpisah. Tambahkan produk yang berbeda ke setiap cart untuk membuktikan bahwa keduanya memiliki inventaris yang terpisah.

Kamu akan menerima empat input:

  1. Produk pertama yang ditambahkan ke cart A
  2. Produk kedua yang ditambahkan ke cart A
  3. Produk pertama yang ditambahkan ke cart B
  4. Produk kedua yang ditambahkan ke cart B

Di file utamamu:

  1. Buat dua cart belanja: cartA dan cartB
  2. Tambahkan dua produk pertama ke cartA
  3. Tambahkan dua produk terakhir ke cartB
  4. Cetak Cart A:, lalu tampilkan list produk cart A
  5. Cetak Cart B:, lalu tampilkan list produk cart B

Misalnya, jika input-nya adalah Apple, Bread, Milk, dan Eggs, output-nya seharusnya:

Cart A:
Apple
Bread
Cart B:
Milk
Eggs

Ingat: kuncinya adalah menginisialisasi products sebagai tabel kosong baru di dalam constructor. Ini memastikan setiap instance cart memiliki list tersendiri, alih-alih berbagi satu tabel di antara semua cart.

Coba sendiri

-- Muat module ShoppingCart dengan require
local ShoppingCart = require('ShoppingCart')

-- Baca input
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()

-- TODO: Buat dua keranjang belanja: cartA dan cartB

-- TODO: Tambahkan product1 dan product2 ke cartA

-- TODO: Tambahkan product3 dan product4 ke cartB

-- TODO: Cetak "Cart A:", lalu tampilkan produk dalam cartA

-- TODO: Cetak "Cart B:", lalu tampilkan produk dalam cartB
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