0基礎lua學習(十三)Metatable

2021-08-10 07:38:28 字數 3336 閱讀 3968

在 lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。

因此 lua 提供了元表(metatable),允許我們改變table的行為,每個行為關聯了對應的元方法。

mytable = {}                          -- 普通表

mymetatable = {} -- 元表

setmetatable(mytable,mymetatable) -- 把 mymetatable 設為 mytable 的元表

--以上**也可以直接寫成一行:

mytable = setmetatable({},{})

--以下為返回物件元表:

getmetatable(mytable) -- 這回返回mymetatable

__index 元方法這是 metatable 最常用的鍵。

lua查詢乙個表元素時的規則,其實就是如下3個步驟:

1.在表中查詢,如果找到,返回該元素,找不到則繼續

2.判斷該錶是否有元表,如果沒有元表,返回nil,有元表則繼續。

3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是乙個表,則重複1、2、3 如果__index方法是乙個函式,則返回該函式的返回值(table和鍵會作為引數傳遞給函式)。

mytable = setmetatable(, )

print(mytable.key1,mytable.key2)

--簡化版

mytable = setmetatable(, })

print(mytable.key1,mytable.key2)

console:

value1 metatablevalue

value1 metatablevalue

用來對錶更新,__index則用來對錶訪問 。

當你給表的乙個缺少的索引賦值,直譯器就會查詢__newindex 元方法:如果存在則呼叫這個函式而不進行賦值操作。

mymetatable = {}

mytable = setmetatable(, )

print(mytable.key1)

--呼叫newkey的時候,發現mytable表中沒有newkey ,所以會呼叫元方法,而不進行賦值

--如果對已存在的索引鍵(newkey),則會進行賦值,而不呼叫元方法 __newindex

mytable.newkey = "新值2"

print(mytable.newkey,mymetatable.newkey)

mytable.key1 = "新值1"

print(mytable.key1,mymetatable.key1)

print("-----------------------------------")

mytable = setmetatable(, )

mytable.key1 = "new value"

mytable.key2 = 4

print(mytable.key1,mytable.key2)

console:

value1

nil 新值2

新值1 nil

表的相加操作符

-- 計算表中最大值,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

endendreturn mn

end-- 兩表相加操作

mytable = setmetatable(, )

secondtable =

mytable = mytable + secondtable

for k,v in

ipairs(mytable) do

print(k,v)

end

console:

1 1

2 2

3 3

4 4

5 5

6 6

有點類似c++的 過載運算子

注意:_ _是兩個下劃線,連在一起!

模式描述

__add

對應的運算子 『+』.

__sub

對應的運算子 『-『.

__mul

對應的運算子 『*』.

__div

對應的運算子 『/』.

__mod

對應的運算子 『%』.

__unm

對應的運算子 『-『.

__concat

對應的運算子 『..』.

__eq

對應的運算子 『==』.

__lt

對應的運算子 『<』.

__le

對應的運算子 『<=』.

__call 元方法在 lua 呼叫乙個值時呼叫。

-- 計算表中最大值,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

endend

return mn

end-- 定義元方法__call

mytable = setmetatable(, )

newtable =

print(mytable(newtable))

console:

70__tostring 元方法用於修改表的輸出行為

mytable = setmetatable(, )

print(mytable)

console:

表所有元素的和為 60

0基礎lua學習(十六)lua的多型 base

使用lua實現c 類似的多型,看起來略微難了一些,這個demo,預設提供了 init類似建構函式的時機。base.lua 儲存類型別的虛表 local class function baseclass super 生成乙個類型別 local class type 在建立物件的時候自動呼叫 class...

0基礎lua學習(六)控制語句

demo 省略了c語言的括號 if a b then else if a c then end lua中不支援switch case demo 定義變數 a 10 使用 if 語句 if a 20 then if 條件為true 時列印以下資訊 print a 小於 20 endprint a 的值...

Lua基礎 十三 模組和包

一 模組的介紹 模組類似於 乙個封裝庫 從lua 5.1 開始,lua加入了 標準的模組管理機制 可以把一些 公用的 放在乙個 檔案 裡,以 api介面的形式 在其他地方呼叫,利於 的重用 和 降低 的耦合度 所有的 標準庫 都是模組 備註 提前載入的 所有標準庫 math string 二定義模組...