Membandingkan Objek (<, >)
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 29 dari 70.
Selain aritmetika dan penggabungan, kamu juga dapat menentukan cara object dibandingkan satu sama lain menggunakan metamethod perbandingan. Metamethod __lt menangani operator "kurang dari" (<).
Saat Lua mengevaluasi a < b, Lua mencari __lt di metatable. Metamethod ini seharusnya mengembalikan true atau false berdasarkan logika perbandinganmu.
local Item = {}
Item.__index = Item
function Item:new(name, price)
local obj = {name = name, price = price}
setmetatable(obj, Item)
return obj
end
function Item.__lt(a, b)
return a.price < b.price
endDengan __lt sudah didefinisikan, sekarang kamu bisa membandingkan item secara langsung:
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- output: true
print(laptop < apple) -- output: falseInilah bagian cerdiknya: Lua otomatis memperoleh operator > dari __lt. Saat kamu menulis a > b, Lua cukup mengevaluasi b < a. Jadi, dengan mendefinisikan __lt saja, kamu mendapatkan kedua arah perbandingan secara gratis.
Tantangan
MudahMari buat class Product yang bisa dibandingkan menggunakan operator < dan > berdasarkan harga. Ini cocok untuk situasi seperti mengurutkan barang di keranjang belanja atau mencari pilihan termurah dalam sebuah list.
Kamu akan membagi kodemu ke dalam dua file:
Product.lua: Definisikan class Product dengan fieldnamedanprice. Sertakan konstruktor:new(name, price)dan implementasikan metamethod__ltuntuk membandingkan harga produk. Ingat, mendefinisikan__ltsecara otomatis juga menyediakan operator>untukmu. Lua yang mengaturnya!main.lua: Gunakan perintah require untuk memuat module Product-mu, buat instance produk dari input, lalu bandingkan untuk menentukan mana yang lebih mahal atau lebih murah.
Kamu akan menerima empat input:
- Nama produk pertama
- Harga produk pertama
- Nama produk kedua
- Harga produk kedua
Di file utama, buat dua produk dengan nama dan harga yang diberikan. Lalu lakukan tiga perbandingan dan cetak hasilnya masing-masing pada baris terpisah:
- Apakah produk pertama lebih kecil daripada produk kedua? (cetak
trueataufalse) - Apakah produk pertama lebih besar daripada produk kedua? (cetak
trueataufalse) - Cetak nama produk yang lebih murah
Misalnya, jika inputnya adalah Apple, 2, Laptop, dan 999, outputnya seharusnya:
true
false
AppleApple (harga 2) lebih kecil daripada Laptop (harga 999), jadi perbandingan pertama menghasilkan true. Apple tidak lebih besar daripada Laptop, jadi perbandingan kedua menghasilkan false. Karena harga Apple lebih rendah, namanya dicetak sebagai produk yang lebih murah.
Coba sendiri
-- Muat module Product dengan require
local Product = require('Product')
-- Baca input
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())
-- TODO: Buat dua instans Product menggunakan Product:new()
-- TODO: Bandingkan produk menggunakan operator < dan cetak true/false
-- TODO: Bandingkan produk menggunakan operator > dan cetak true/false
-- TODO: Cetak nama produk yang lebih murah
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