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

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

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

challenge icon

Tantangan

Mudah

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

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