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
endSekarang, 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.
Tantangan
MudahMari 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 classProductdengan pola prototipe standar. Setiap produk harus menyimpansku(pengenal unik) danname. Implementasikan metamethod__eqagar 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
__eqyang membandingkan produk berdasarkan SKU-nya
Kamu akan menerima enam input:
- SKU untuk produk pertama
- Nama untuk produk pertama
- SKU untuk produk kedua
- Nama untuk produk kedua
- SKU untuk produk ketiga
- Nama untuk produk ketiga
Di file utama, buat tiga produk menggunakan input yang diberikan, lalu cetak:
- Info setiap produk (tiga baris)
- Hasil perbandingan produk 1 dengan produk 2
- 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
falsePerhatikan 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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online