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 8Perhatikan 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 2Metamethod ini melengkapi operasi aritmetika dasar untuk tipe kustommu, sehingga kamu memiliki kendali penuh atas perilaku operator matematika pada tabelmu.
Tantangan
MudahTulis 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
xdanyyang diisi dengan koordinat yang diberikan - Buat metatable dengan
__mulyang menangani perkalian antara vektor dan skalar - Fungsi
__mulharus memeriksa operand mana yang berupa angka dan mana yang berupa tabel - Kembalikan tabel baru dengan
x = vec.x * scalardany = 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 vektory(angka): Koordinat y dari vektorscalar(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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Iterasi Tabel Tingkat Lanjut
Iterasi dengan pairs()Iterasi dengan ipairs()pairs() vs. ipairs()Rangkuman: Lembar Karakter4Pengenalan Metatable
Apa Itu Metatable?setmetatable & getmetatableMetamethod __indexMetamethod __newindexMetamethod __tostringMetamethod Aritmetika Bagian 1Metamethod Aritmetika Bagian 2Ulasan: Tabel Hanya-Baca2Fungsi library tabel Lainnya
table.concat()Pembuatan tabel & unpack()table.sort()Pengurutan Kustom dengan FungsiRangkuman, Papan Skor TertinggiLatihan sendiri: Compiler Lua online