Menu
CoddyTech

Metamethod Aritmetika Bagian 2

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

Selain penjumlahan dan pengurangan, kamu juga dapat menentukan perilaku perkalian dan pembagian untuk tabelmu menggunakan metamethod __mul dan __div. Metamethod ini bekerja dengan cara yang sama seperti __add dan __sub, tetapi merespons operator * dan /.

Metamethod __mul sangat berguna saat kamu ingin menskalakan nilai-nilai sebuah tabel. Contohnya, mengalikan sebuah vektor dengan angka (yang disebut skalar) seharusnya mengalikan setiap komponennya:

local vector = {x = 3, y = 4}

local meta = {
    __mul = function(a, b)
        local scalar = type(a) == "number" and a or b
        local vec = type(a) == "table" and a or b
        return {x = vec.x * scalar, y = vec.y * scalar}
    end
}

setmetatable(vector, meta)

local scaled = vector * 2
print(scaled.x, scaled.y)  -- output: 6  8

Perhatikan bagaimana fungsi memeriksa operand mana yang berupa angka dan mana yang berupa tabel. Ini memungkinkan vector * 2 dan 2 * vector berfungsi dengan benar.

Metamethod __div bekerja dengan cara yang serupa untuk pembagian:

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

setmetatable(vector, meta)

local divided = vector / 2
print(divided.x, divided.y)  -- output: 1.5  2

Metamethod ini melengkapi operasi aritmetika dasar untuk tipe kustommu, sehingga kamu memiliki kendali penuh atas perilaku operator matematika pada tabelmu.

challenge icon

Tantangan

Mudah

Tulis fungsi scaleVector yang menerima x, y, dan scalar, lalu mengembalikan vektor yang telah diskalakan sebagai string berformat.

Buat tabel vektor dengan koordinat yang diberikan, pasangkan metatable dengan metamethod __mul untuk mengaktifkan perkalian skalar, kalikan vektor dengan skalar menggunakan operator *, lalu kembalikan hasilnya.

Logika:

  • Buat tabel vektor dengan kunci x dan y yang diisi dengan koordinat yang diberikan
  • Buat metatable dengan __mul yang menangani perkalian antara vektor dan skalar
  • Fungsi __mul harus memeriksa operand mana yang berupa angka dan mana yang berupa tabel
  • Kembalikan tabel baru dengan x = vec.x * scalar dan y = vec.y * scalar
  • Pasangkan metatable ke tabel vektor menggunakan setmetatable()
  • Kalikan vektor dengan skalar menggunakan vector * scalar
  • Kembalikan hasilnya sebagai string dengan format "x y" (nilai x dan y dipisahkan oleh spasi)

Parameter:

  • x (angka): Koordinat x dari vektor
  • y (angka): Koordinat y dari vektor
  • scalar (angka): Nilai skalar untuk mengalikan vektor

Mengembalikan: Vektor yang telah diskalakan sebagai string dengan format "x y" (string)

Coba sendiri

function scaleVector(x, y, scalar)
    -- 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