Menjumlahkan Objek
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 26 dari 70.
Kamu sudah melihat bagaimana metamethod seperti __tostring dan __eq memungkinkan kamu menyesuaikan perilaku object. Sekarang kita akan menerapkannya pada operasi aritmetika, dimulai dengan penjumlahan.
Metamethod __add menentukan apa yang terjadi saat kamu menggunakan operator + di antara dua object. Saat Lua menemukan a + b, Lua mencari __add di metatable salah satu operand.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
endPerhatikan bahwa __add didefinisikan dengan titik, bukan titik dua. Fungsi ini menerima kedua operand sebagai argumen dan sebaiknya mengembalikan object baru, bukan mengubah salah satu object asli. Ini membuat operasi tersebut mudah diprediksi dan aman.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- output: 4 6Inti pentingnya adalah __add harus berada di metatable itu sendiri (di sini, Vector), bukan hanya di object. Karena kita menetapkan Vector sebagai metatable untuk semua instance, semuanya otomatis memiliki perilaku ini.
Tantangan
MudahMari kita buat class Vector yang mendukung penjumlahan menggunakan operator +. Ini langkah pertamamu untuk mempelajari operator overloading, agar object-mu dapat bekerja secara alami dengan operator bawaan Lua.
Kamu akan mengatur kodemu dalam dua file:
Vector.lua: Definisikan class Vector dengan komponenxdany. Sertakan constructor:new(x, y)dan implementasikan metamethod__addagar penjumlahan dua vector menghasilkan vector baru dengan komponen gabungan. Ingat,__addmenggunakan sintaks titik, bukan titik dua, dan menerima kedua operand sebagai argumen.main.lua: Require module Vector-mu, buat instance vector, dan tunjukkan bahwa penjumlahannya menghasilkan hasil yang benar.
Kamu akan menerima empat input:
- Komponen x vector pertama
- Komponen y vector pertama
- Komponen x vector kedua
- Komponen y vector kedua
Di file utama, buat dua vector dengan komponen yang diberikan, jumlahkan keduanya menggunakan operator +, lalu cetak nilai x dan y dari vector hasil pada baris terpisah.
Misalnya, jika input-nya adalah 3, 4, 1, 2, output-nya seharusnya:
4
6Vector pertama (3, 4) ditambah vector kedua (1, 2) sama dengan vector baru (4, 6).
Coba sendiri
-- Muat module Vector dengan require
local Vector = require('Vector')
-- Baca input
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())
-- TODO: Buat dua instance Vector menggunakan nilai input
-- TODO: Jumlahkan kedua vektor menggunakan operator +
-- TODO: Cetak nilai x dan y dari vektor hasil 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