Menu
CoddyTech

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)
end

Perhatikan 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  6

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

challenge icon

Tantangan

Mudah

Mari 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 komponen x dan y. Sertakan konstruktor :new(x, y) dan implementasikan metamethod __add agar penjumlahan dua vector menghasilkan vector baru dengan komponen gabungan. Definisikan __add dengan 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:

  1. Komponen x vector pertama
  2. Komponen y vector pertama
  3. Komponen x vector kedua
  4. 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
6

Vector 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
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