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 6Fungsi __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 2Kemampuan untuk menentukan perilaku operator kustom ini disebut operator overloading.
Tantangan
MudahTulis 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 = x1dany = y1 - Buat tabel vektor kedua dengan kunci
x = x2dany = y2 - Buat metatable dengan
__addyang menerima dua vektor dan mengembalikan tabel baru denganx = a.x + b.xdany = 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 pertamay1(number): Koordinat y dari vektor pertamax2(number): Koordinat x dari vektor keduay2(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
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