Lua 元表以及元方法

2021-10-10 18:13:42 字數 1954 閱讀 1154

例如

a=

10b=

20print

(a+b)

我們可以得到30,但是如果兩個table型別相加呢?

a=

b=print

(a+b)

輸出結果是:

lua: hello world.lua:

3: attempt to perform arithmetic on global 'a'

(a table value)

stack traceback:

hello world.lua:3:

in main chunk

[c]:?

>exit code:

1

因此可以通過定義元表的方式,對於兩個table相加的操作進行定義:

a=

--定義兩個表

b= mt=

--定義乙個元表

mt.__add=

function

(a,b)

--定義加字段的函式功能

local len=table.

getn

(a)--取a的長度

local res=

--定義乙個結果表(用作輸出)

for i=

1,len do

--遍歷所有表a中的元素

res[i]

=a[i]

+b[i]

--按照下標訪問

endreturn res --返回結果表

endsetmetatable

(a,mt)

setmetatable

(b,mt)

c=a+b

for k,v in

ipairs

(c)do

print

(k,v)

end

輸出結果

152

739

個人的理解是,這個原表有點像是c++中的運算子過載。其中__add就是用於識別「+」號的運算子。通過mt.__add定義乙個function,其中引數就是兩個相加的table。而setmetatable就是把兩個table型別的a和b關聯元表,使其可以使用元表中的方法進行運算。

下面是乙個拼接的例子

a=

b= mt=

mt.__concat=

function

(a,b)

local p=table.

getn

(a) local q=table.

getn

(b) local res=

for i=

1,p do

res[i]

=a[i]

..b[i]

endreturn res

endsetmetatable

(a,mt)

setmetatable

(b,mt)

c=a.

.bfor k,v in

ipairs

(c)do

print

(k,v)

end

輸出:

1172

28339

每一種運算操作都有對應的字段,最好記住,記不住就查吧

當我們訪問乙個table中不存在的字段時,會返回什麼值呢。一般情況下,會返回乙個nil。但是也不一定,lua按照以下步驟,決定是返回nil還是其他值。

1,當訪問乙個table欄位時,如果有table這個字段,則直接返回對應值。

2,當table沒有這個欄位時,直譯器就回去查詢乙個叫__index的元方法,接下來會呼叫對應的元方法,返回元方法返回的值。

3,如果沒有這個元方法,則返回nil

lua元表與元方法

1.首先我們先了解下lua的表 2.元表 是用來定義對table操作的方式表 我們先來看一下問題 t1 t2 我們把這兩張錶拼起來 第一種方法 table.inster t1,t2 1 第二種方法 元表 mt 方法類似於c 的運算子過載可以看出我們過載的是 mt.add function t1,t2...

lua元表與元方法

lua中提供的元表 metatable 與元方法 metamethod 是一種非常重要的語法,metatable主要用於做一些類似於c 過載操作符式的功能。lua中提供的元表是用於幫助lua變數完成某些非預定義功能的個性化行為,如兩個table的相加,通過讓兩者指向同一元表並修改該元表的元方法可以實...

Lua元表和元表方法

今天學習lua中的元表,書上講的太難懂了,網上搜尋教程也將的模模糊糊,搜了一會總結了一下經驗,跟大家分享一下,希望對您有所幫助。如何設定元表?local t local mt getmetatable t nil setmetatable t,mt 將t1設定為t的元表 getmetatable t...