Menu
CoddyTech

Metamethod Aritmetika Bagian 1

Termasuk bagian Logika dan Alur dalam perjalanan Lua di Coddy. Pelajaran 21 dari 54.

Kamu sudah mempelajari cara menyesuaikan apa yang terjadi saat kamu mencetak tabel menggunakan __tostring. Sekarang kamu akan mempelajari bahwa metatable juga dapat menentukan apa yang terjadi saat kamu menggunakan operator aritmetika seperti + dan - pada tabelmu.

Biasanya, jika kamu mencoba menjumlahkan dua tabel dengan operator +, Lua akan memberikan error karena Lua tidak tahu cara menjumlahkan tabel. Namun, dengan metamethod aritmetika, kamu dapat menentukan dengan tepat arti penjumlahan untuk tipe data kustommu.

Metamethod __add mengatur perilaku penjumlahan. Saat Lua menemukan operator + di antara dua nilai dan setidaknya salah satunya memiliki metatable dengan __add, Lua memanggil fungsi tersebut alih-alih menghasilkan error:

local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}

local meta = {
    __add = function(a, b)
        return {x = a.x + b.x, y = a.y + b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 + v2
print(v3.x, v3.y)  -- output: 4  6

Fungsi __add menerima dua argumen: operan kiri dan operan kanan. Dalam contoh ini, fungsi tersebut membuat tabel baru dengan nilai x dan y yang merupakan jumlah nilai terkait dari kedua tabel input.

Demikian pula, metamethod __sub mengatur pengurangan dengan operator -:

local meta = {
    __sub = function(a, b)
        return {x = a.x - b.x, y = a.y - b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 - v2
print(v3.x, v3.y)  -- output: 2  2

Kemampuan untuk menentukan perilaku operator kustom ini disebut operator overloading.

challenge icon

Tantangan

Mudah

Tulis fungsi addVectors yang menerima x1, y1, x2, dan y2, lalu mengembalikan hasil penjumlahan dua vektor.

Buat dua tabel vektor dengan koordinat yang diberikan, pasang metatable dengan metamethod __add untuk memungkinkan penjumlahan vektor, jumlahkan keduanya menggunakan operator +, lalu kembalikan hasilnya sebagai string berformat.

Logika:

  • Buat tabel vektor pertama dengan kunci x = x1 dan y = y1
  • Buat tabel vektor kedua dengan kunci x = x2 dan y = y2
  • Buat metatable dengan __add yang menerima dua vektor dan mengembalikan tabel baru dengan x = a.x + b.x dan y = a.y + b.y
  • Pasang metatable ke kedua tabel vektor menggunakan setmetatable()
  • Jumlahkan kedua vektor menggunakan v1 + v2
  • Kembalikan hasilnya sebagai string dengan format "x y" (nilai x dan y dipisahkan oleh spasi)

Parameter:

  • x1 (number): Koordinat x dari vektor pertama
  • y1 (number): Koordinat y dari vektor pertama
  • x2 (number): Koordinat x dari vektor kedua
  • y2 (number): Koordinat y dari vektor kedua

Mengembalikan: Jumlah kedua vektor sebagai string dengan format "x y" (string)

Coba sendiri

function addVectors(x1, y1, x2, y2)
    -- Tulis kodemu di sini
end
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Lua online