麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

Lua中的元表和元方法學習筆記

2024-07-21 23:04:21
字體:
來源:轉載
供稿:網友

元表(metatable)是 Lua 里每種類型的值的默認操作方式的集合,例如,數字可以加減乘除、字符串可以連接合并、table 可以插入一對 key-value 值、函數可以被調用等等,這些操作都遵循其預定義的行為來執行。

而值的默認操作方式不是一成不變的,可以通過元表來修改其行為表現,或者是新定義一些默認沒有的操作。例如,當兩個 table 相加時, Lua 會檢查它們之間的元表里是否有 "__add" 這個函數,如果定義有這個函數, 則調用這個函數來執行一次加法操作。

這里,相加這個操作的函數名 -- "__add" 是元表的鍵名(元表的鍵名也稱之為事件(event),一般以 2 個下劃線 "_" 開頭),而 "__add" 函數則是這個相加操作的元方法(metamethod)。對于值的操作,Lua 都將其關聯上一個被稱作事件的指定健,當 Lua 需要對一個值發起這些操作中的一個時, 它會去檢查值的元表里是否有對應事件。如果有,則鍵名對應的值(元方法)將控制 Lua 怎樣去執行這個操作。

getmetatable - 獲取元表

Lua 里每個值都有一個元表。table 類型和 userdata 類型的值可以有各自獨立的元表,而其他類型的值則是公用其類型所預先定義的元表。例如,可以用 getmetatable 來獲取一個字符串的元表:

 

復制代碼 代碼如下:

a = "just a test"
print(getmetatable(a))

 

上面的操作會輸出 "table: 0x7fa8614080f0" 的 table,里面包含著預先定義給字符串的操作方法,其內容結構如下:

 

復制代碼 代碼如下:

-__index-sub [function: 0x7fee39408050]
        -upper [function: 0x7fee394080a0]
        -len [function: 0x7fee39407ec0]
        -gfind [function: 0x7fee39407e20]
        -rep [function: 0x7fee39407fb0]
        -find [function: 0x7fee39407d30]
        -match [function: 0x7fee39407f60]
        -char [function: 0x7fee39407c90]
        -dump [function: 0x7fee39407ce0]
        -gmatch [function: 0x7fee39407e20]
        -reverse [function: 0x7fee39408000]
        -byte [function: 0x7fee39407c40]
        -format [function: 0x7fee39407d80]
        -gsub [function: 0x7fee39407e70]
        -lower [function: 0x7fee39407f10]

 

Lua 在創建新的 table 時不會創建元表,因此想調用 getmetatable 函數獲取其元表的話,只會返回一個 nil 值。

 

復制代碼 代碼如下:

tbl = {}
print(getmetatable(tbl))

 

setmetatable - 修改元表

對于上面所說的新創建的 table 是空元表的問題,可以用 setmetatable 來修改其元表:

 

復制代碼 代碼如下:

tbl = {}
t1 = {key = "val"}
setmetatable(tbl, t1)
print(getmetatable(tbl))

 

對于上面所說的 2 個 table 相加的情況,可以給 table 添加一個 __add 的元方法就可以進行相加操作:

 

復制代碼 代碼如下:

t1 = {"a", "b", "c", "d"}
t2 = {5, 6, 7, 8, 9}
 
mt = {}
mt.__add = function(a, b)
    local tbl = {}
    local ret = {}
    for k, v in pairs(a) do tbl[v] = true end
    for k, v in pairs(b) do tbl[v] = true end
    for k, v in pairs(tbl) do
        table.insert(ret, k)
    end
    return ret
end
 
setmetatable(t1, mt)
setmetatable(t2, mt)
 
t = t1 + t2
for k, v in pairs(t) do print(v) end
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美色大成网站www永久男同 | 羞羞的视频在线 | 黄色片小说 | 一本在线高清码电影 | a免费视频 | 中文字幕在线观看亚洲 | 久久久三区 | 欧美一级黄 | 欧美一级毛片免费观看 | www.国产一区.com | 欧美成人视| 看国产毛片| 在线观看免费视频麻豆 | 久久99国产精品免费网站 | xxxx69hd一hd| 日韩精品a在线观看 | 亚洲影视在线 | 午夜精品老牛av一区二区三区 | 亚洲一区二区三区在线看 | 久草热久 | 五月婷婷第四色 | 新久草视频 | 福利一区二区三区视频在线观看 | 视频一区二区三区免费观看 | 午夜国内精品a一区二区桃色 | 天天干导航 | 久久国产精品免费视频 | 亚洲成人国产 | 1314av | 免费在线观看成年人视频 | 国产日韩精品欧美一区视频 | 黄色a级片视频 | 国产一区二区三区四区波多野结衣 | 亚洲射逼| fc2成人免费人成在线观看播放 | 免费播放欧美毛片 | 最新黄色毛片 | 久久av喷吹av高潮av懂色 | 久色亚洲 | 久精品久久 | 久久欧美亚洲另类专区91大神 |