Lua tabel elemen (metatable)
Pada tabel Lua, kita dapat mengakses nilai kunci yang sesuai untuk mendapatkan nilai, tetapi tidak dapat dioperasikan pada dua meja.
Oleh karena itu, Lua menyediakan elemen tabel (metatable), meja memungkinkan kita untuk mengubah perilaku setiap tindakan yang terkait dengan metode elemen yang sesuai.
Misalnya, menggunakan meta tabel, kita dapat menentukan bagaimana tabel Lua menghitung jumlah dari dua operasi a + b.
Ketika Lua upaya menambahkan dua tabel, periksa dulu apakah ada salah satu dari dua meja yuan, setelah memeriksa apakah ada tempat yang disebut "__add" lapangan, jika ditemukan, kemudian memanggil nilai yang sesuai. "__add" Dan bidang instant lainnya, yang sesuai nilai (sering fungsi atau meja) adalah "Metode Elemen."
Ada dua fungsi yang sangat penting untuk menangani tabel yuan:
- setmetatable (meja, metatable): mengatur meja untuk elemen tabel yang ditentukan (metatable), jika ada __metatable meja elemen kunci (metatable) di, setmetatable gagal.
- getmetatable (tabel): Mengembalikan tabel objek metadata (metatable).
Contoh berikut menunjukkan cara mengatur meja untuk elemen tabel yang ditentukan:
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
Kode di atas dapat ditulis langsung ke baris:
mytable = setmetatable({},{})
Berikut ini adalah tabel pulang objek metadata:
getmetatable(mytable) -- 这回返回mymetatable
__index Metode Elemen
Ini adalah yang paling umum digunakan metatable kunci.
Ketika Anda melewati kunci untuk mengakses meja, dan jika kunci tidak memiliki nilai, maka Lua akan menemukan tabel metatable (dengan asumsi metatable) di kunci __index. Jika __index berisi meja, Lua akan menemukan tombol yang sesuai dalam tabel.Kita dapat menggunakan perintah lua untuk masuk ke modus interaktif Views:
$ lua Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio > other = { foo = 3 } > t = setmetatable({}, { __index = other }) > t.foo 3 > t.bar nil
Jika __index mengandung fungsi, kemudian, Lua akan memanggil fungsi, meja dan kunci akan diteruskan sebagai parameter ke fungsi.
metode elemen __index untuk melihat elemen tabel ada, jika tidak, kembali hasilnya nihil, jika itu ada dengan __index hasil pulang.
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
Contoh output:
value1 metatablevalue
contoh analisis:
tabel mytable ditugaskan{key1 = "value1"}.
mytable set meta meja metode elemen __index.
Cari key1 pada tabel mytable, jika ditemukan, kembali elemen yang tidak dapat ditemukan, lanjutkan.
Cari key2 dalam tabel mytable, jika ditemukan, kembali metatablevalue, menemukan lanjutnya.
Menganalisis meta tabel tidak memiliki metode __index, jika metode __index adalah fungsi, memanggil fungsi.
- metode elemen untuk memeriksa apakah masuk "key2" kunci parameter (mytable.key2 set), jika masuk "key2" parameter kembali "metatablevalue", jika tidak mytable sesuai kunci.
Kita dapat menulis kode di atas adalah sederhana:
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
ringkasan
Lua lookup aturan elemen tabel ketika, pada kenyataannya, berikut tiga langkah:
- 1. Cari di meja, jika ditemukan, kembali bahwa unsur, tidak ditemukan, lanjutkan
- 2. menentukan apakah meja memiliki meja RMB, jika tidak ada tabel dolar meja elemen, kembali nihil, ada dilanjutkan.
- 3. Menganalisis meta meja tidak memiliki metode __index, jika metode __index adalah nihil, kembali nil; jika metode __index adalah meja, ulangi 1,2,3, jika metode __index adalah fungsi, kembali fungsi nilai kembali.
__newindex Metode Elemen
metode elemen __newindex digunakan untuk memperbarui meja, __ indeks digunakan untuk mengakses tabel.
Ketika Anda memberikan hilang tabel indeks tugas, penafsir akan terlihat __newindex Metode Elemen: Jika Anda memanggil fungsi ini tanpa tugas.
Contoh berikut menunjukkan aplikasi __newindex Metode Elemen:
mymetatable = {} mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable }) print(mytable.key1) mytable.newkey = "新值2" print(mytable.newkey,mymetatable.newkey) mytable.key1 = "新值1" print(mytable.key1,mymetatable.key1)
Contoh pelaksanaan output di atas adalah:
value1 nil 新值2 新值1 nil
Contoh di atas meja-meja metode elemen __newindex, ketika indeks kunci (newkey) tugas baru (mytable.newkey = "nilai baru 2"), akan memanggil metode elemen tanpa tugas. Dan jika kunci indeks yang ada (key1), akan melaksanakan tugas, tanpa menyebut Metode Elemen __newindex.
Contoh berikut menggunakan fungsi rawset untuk memperbarui tabel:
mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, "\""..value.."\"") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2)
Contoh pelaksanaan output di atas adalah:
new value "4"
Tambahkan Operator untuk meja
Contoh berikut menunjukkan dua tabel menambahkan operasi:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 两表相加操作 mytable = setmetatable({ 1, 2, 3 }, { __add = function(mytable, newtable) for i = 1, table_maxn(newtable) do table.insert(mytable, table_maxn(mytable)+1,newtable[i]) end return mytable end }) secondtable = {4,5,6} mytable = mytable + secondtable for k,v in ipairs(mytable) do print(k,v) end
Contoh pelaksanaan output di atas adalah:
1 1 2 2 3 3 4 4 5 5 6 6
__add elemen kunci yang terkandung dalam tabel, dan menambahkan operasi. Sebuah daftar tindakan yang sesuai dengan tabel berikut:
mode | deskripsi |
---|---|
__add | Operator yang sesuai '+'. |
__sub | Operator yang sesuai '-'. |
__mul | Operator yang sesuai '*'. |
__div | Operator yang sesuai '/'. |
__mod | Operator yang sesuai '%'. |
__unm | Operator yang sesuai '-'. |
__concat | Operator yang sesuai '..'. |
__eq | Operator yang sesuai '=='. |
__lt | Operator yang sesuai '<'. |
__le | Operator yang sesuai '<='. |
__call Metode Elemen
metode elemen __call disebut ketika Lua panggilan nilai. Contoh berikut menggambarkan tabel perhitungan elemen, dan:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 定义元方法__call mytable = setmetatable({10}, { __call = function(mytable, newtable) sum = 0 for i = 1, table_maxn(mytable) do sum = sum + mytable[i] end for i = 1, table_maxn(newtable) do sum = sum + newtable[i] end return sum end }) newtable = {10,20,30} print(mytable(newtable))
Contoh pelaksanaan output di atas adalah:
70
__toString Metode Elemen
metode elemen __toString digunakan untuk memodifikasi perilaku tabel output. Contoh berikut dari tabel output kebiasaan kami isi:
mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " .. sum end }) print(mytable)
Contoh pelaksanaan output di atas adalah:
表所有元素的和为 60
Dari artikel ini kita bisa tahu tabel Element bisa baik sebuah menyederhanakan fungsi kode kita, sehingga pemahaman Lua meta meja memungkinkan kita untuk menulis sederhana kode Lua sangat baik.