Mengurangkan Objek
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 27 dari 70.
Sama seperti __add menangani operator +, metamethod __sub menentukan perilaku operator -. Polanya sama. Kamu mendefinisikan fungsi yang menerima dua operand dan mengembalikan object baru.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endSaat bekerja dengan warna RGB, pengurangan dapat menghasilkan nilai negatif. Dalam aplikasi nyata, kamu mungkin ingin membatasi hasil ke rentang yang valid (0-255), tetapi struktur inti metamethod tetap sama.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- output: 150 120 80Ingat: definisikan __sub dengan titik (bukan titik dua) karena itu adalah metamethod yang Lua panggil secara langsung dengan kedua operand sebagai argumen.
Tantangan
MudahMari buat class Color yang mendukung pengurangan menggunakan operator -. Warna direpresentasikan oleh nilai RGB, dan mengurangi satu warna dari warna lainnya akan menghasilkan warna baru dengan selisih setiap komponennya.
Kamu akan menyusun kodemu dalam dua file:
Color.lua: Definisikan class Color dengan komponenr,g, danbyang mewakili nilai merah, hijau, dan biru. Sertakan constructor:new(r, g, b)dan implementasikan metamethod__subagar pengurangan dua warna menghasilkan warna baru dengan selisih setiap komponennya. Ingat,__submenggunakan sintaks titik dan menerima kedua operand sebagai argumen.main.lua: Muat module Color, buat instance warna dari input yang diberikan, kurangi keduanya, lalu tampilkan nilai RGB hasilnya.
Kamu akan menerima enam input:
- Komponen merah warna pertama
- Komponen hijau warna pertama
- Komponen biru warna pertama
- Komponen merah warna kedua
- Komponen hijau warna kedua
- Komponen biru warna kedua
Di file utamamu, buat dua warna dengan nilai RGB yang diberikan, kurangi warna kedua dari warna pertama menggunakan operator -, lalu cetak nilai r, g, dan b dari warna hasilnya pada baris terpisah.
Misalnya, jika inputnya adalah 200, 150, 100, 50, 30, 20, outputnya seharusnya:
150
120
80Warna pertama (200, 150, 100) dikurangi warna kedua (50, 30, 20) menghasilkan warna baru (150, 120, 80).
Coba sendiri
-- Muat module Color dengan require
local Color = require('Color')
-- Baca nilai input
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: Buat dua instance Color dengan nilai RGB yang diberikan
-- TODO: Kurangi warna pertama dengan warna kedua menggunakan operator -
-- TODO: Cetak nilai r, g, dan b dari warna hasilnya pada baris terpisah
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