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 memungkinkanmu menyesuaikan perilaku object. Sekarang kita akan menerapkannya pada operasi aritmetika, dimulai dengan penjumlahan.
Metode metamorf __add menentukan apa yang terjadi saat kamu menggunakan operator + antara dua object. Saat Lua menemukan a + b, Lua mencari __add dalam 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. Lua meneruskan kedua operand sebagai argumen biasa, dan bentuk titik memberi nama pada keduanya. Tanda titik dua juga bisa digunakan, karena function Vector:__add(other) sama dengan function Vector.__add(self, other), tetapi bentuk titik adalah konvensinya. __add sebaiknya mengembalikan objek baru, bukan mengubah salah satu objek asli. Ini membuat operasi tetap 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 6Hal penting yang perlu dipahami adalah __add harus ada di metatable itu sendiri (di sini, Vector), bukan hanya di objek. Karena kita menetapkan Vector sebagai metatable untuk semua instans, semuanya otomatis memiliki perilaku ini.
Tantangan
MudahMari buat class Vector yang mendukung penjumlahan menggunakan operator +. Ini langkah pertamamu mengenal kelebihan beban operator, sehingga object-mu dapat bekerja secara alami dengan operator bawaan Lua.
Kamu akan membagi kodemu ke dalam dua file:
Vector.lua: Definisikan class Vector-mu dengan komponenxdany. Sertakan konstruktor:new(x, y)dan implementasikan metamethod__addagar penjumlahan dua vector menghasilkan vector baru dengan komponen gabungan. Definisikan__adddengan titik, agar kedua operand diterima sebagai argumen bernama.main.lua: Gunakan require untuk memuat module Vector-mu, buat instance vector, lalu tunjukkan bahwa penjumlahan keduanya menghasilkan nilai 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) menghasilkan 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