Menu
CoddyTech

Pemeriksaan Kesetaraan

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

Kamu sudah melihat bagaimana __tostring mengatur tampilan object. Metamethod lain yang berguna adalah __eq, yang menentukan kapan dua object dianggap sama menggunakan operator ==.

Secara default, membandingkan dua tabel dengan == akan memeriksa apakah keduanya adalah tabel yang sama persis di memori. Dua object terpisah dengan data identik akan menghasilkan false:

local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2)  -- output: false (tabel yang berbeda)

Dengan __eq, kamu dapat menentukan logika kesetaraan sendiri. Di dalam class, kamu menambahkannya seperti __tostring, sebagai fungsi di tabel class. Agar kesetaraan berfungsi, kedua object harus menggunakan metatable yang sama:

local User = {}
User.__index = User

function User:new(id, name)
    local instance = {}
    setmetatable(instance, self)
    instance.id = id
    instance.name = name
    return instance
end

function User:__eq(other)
    return self.id == other.id
end

Sekarang, dua object User dianggap sama jika memiliki ID yang sama, terlepas dari field lainnya:

local u1 = User:new(101, "Alice")
local u2 = User:new(101, "Bob")
local u3 = User:new(202, "Alice")

print(u1 == u2)  -- output: true (ID sama)
print(u1 == u3)  -- output: false (ID berbeda)

Pola ini berguna saat object merepresentasikan entitas dunia nyata dengan pengenal unik, seperti saat membandingkan catatan database, entitas game, atau object apa pun yang identitasnya lebih penting daripada lokasi memori.

challenge icon

Tantangan

Mudah

Mari buat class Product yang dapat menentukan apakah dua produk adalah barang yang sama, meskipun disimpan di tabel yang benar-benar berbeda! Dalam sistem ritel, produk sering memiliki kode SKU (Stock Keeping Units) yang unik, dan dua produk dianggap sama jika memiliki SKU yang sama, terlepas dari detail lain seperti perubahan harga.

Kamu akan mengatur kodemu dalam dua file:

  • Product.lua: Definisikan class Product dengan pola prototipe standar. Setiap produk harus menyimpan sku (pengenal unik) dan name. Implementasikan metamethod __eq agar dua produk dianggap sama jika memiliki SKU yang sama: nama tidak berpengaruh pada kesamaan.
  • main.lua: Gunakan require untuk memuat module Product-mu dan buat beberapa instance produk. Bandingkan produk-produk tersebut menggunakan operator == untuk melihat cara kerja logika kesamaan kustommu.

Class Product-mu harus mencakup:

  • Constructor :new(sku, name)
  • Method :getInfo() yang mengembalikan string dengan format: [sku]: [name]
  • Metamethod __eq yang membandingkan produk berdasarkan SKU-nya

Kamu akan menerima enam input:

  1. SKU untuk produk pertama
  2. Nama untuk produk pertama
  3. SKU untuk produk kedua
  4. Nama untuk produk kedua
  5. SKU untuk produk ketiga
  6. Nama untuk produk ketiga

Di file utama, buat tiga produk menggunakan input yang diberikan, lalu cetak:

  1. Info setiap produk (tiga baris)
  2. Hasil perbandingan produk 1 dengan produk 2
  3. Hasil perbandingan produk 1 dengan produk 3

Misalnya, jika inputnya adalah ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789, dan Keyboard, outputnya seharusnya:

ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
false

Perhatikan bahwa dua produk pertama sama (SKU-nya sama), meskipun namanya berbeda. Beginilah sistem inventaris sungguhan melacak produk saat nama berubah dan diperbarui!

Coba sendiri

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

-- Baca input
local sku1 = io.read()
local name1 = io.read()
local sku2 = io.read()
local name2 = io.read()
local sku3 = io.read()
local name3 = io.read()

-- TODO: Buat tiga instance Product menggunakan input

-- TODO: Cetak informasi setiap produk (tiga baris)

-- TODO: Cetak hasil perbandingan produk 1 dengan produk 2

-- TODO: Cetak hasil perbandingan produk 1 dengan produk 3
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