Menu
CoddyTech

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
end

Dengan __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: false

Inilah 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.

challenge icon

Tantangan

Mudah

Mari 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 field name dan price. Sertakan konstruktor :new(name, price) dan implementasikan metamethod __lt untuk membandingkan harga produk. Ingat, mendefinisikan __lt secara 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:

  1. Nama produk pertama
  2. Harga produk pertama
  3. Nama produk kedua
  4. 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:

  1. Apakah produk pertama lebih kecil daripada produk kedua? (cetak true atau false)
  2. Apakah produk pertama lebih besar daripada produk kedua? (cetak true atau false)
  3. Cetak nama produk yang lebih murah

Misalnya, jika inputnya adalah Apple, 2, Laptop, dan 999, outputnya seharusnya:

true
false
Apple

Apple (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
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