Latest web development tutorials

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.