欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Lua中的元表和元方法學(xué)習(xí)筆記

 更新時(shí)間:2014年12月10日 11:54:23   投稿:junjie  
這篇文章主要介紹了Lua中的元表和元方法學(xué)習(xí)筆記,本文主要講解了getmetatable獲取元表、setmetatable修改元表等內(nèi)容,需要的朋友可以參考下

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

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

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

getmetatable - 獲取元表

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

復(fù)制代碼 代碼如下:

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

上面的操作會輸出 "table: 0x7fa8614080f0" 的 table,里面包含著預(yù)先定義給字符串的操作方法,其內(nèi)容結(jié)構(gòu)如下:

復(fù)制代碼 代碼如下:

-__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 在創(chuàng)建新的 table 時(shí)不會創(chuàng)建元表,因此想調(diào)用 getmetatable 函數(shù)獲取其元表的話,只會返回一個(gè) nil 值。

復(fù)制代碼 代碼如下:

tbl = {}
print(getmetatable(tbl))

setmetatable - 修改元表

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • lua日志文件處理代碼

    lua日志文件處理代碼

    本文給大家分享的是使用lua編寫的日志文件的處理代碼,非常的簡單實(shí)用,有需要的小伙伴可以參考下。
    2015-09-09
  • Lua中table的遍歷詳解

    Lua中table的遍歷詳解

    這篇文章主要介紹了Lua中table的遍歷詳解,本文講解了4種遍歷方法,并詳細(xì)分析了這4種方法的特點(diǎn)、使用環(huán)境、相關(guān)知識等,需要的朋友可以參考下
    2015-04-04
  • Lua和C++的通信流程代碼實(shí)例

    Lua和C++的通信流程代碼實(shí)例

    這篇文章主要介紹了Lua和C++的通信流程代碼實(shí)例,本文是上一篇的DEMO,本文用代碼講解Lua和C++之間的通信,需要的朋友可以參考下
    2014-09-09
  • Lua中的string庫(字符串函數(shù)庫)總結(jié)

    Lua中的string庫(字符串函數(shù)庫)總結(jié)

    這篇文章主要介紹了Lua中的string庫(字符串函數(shù)庫)總結(jié),本文講解了string庫的操作方法,著重講解了string.format方法,需要的朋友可以參考下
    2014-11-11
  • Lua table的concat方法使用實(shí)例

    Lua table的concat方法使用實(shí)例

    這篇文章主要介紹了Lua table的concat方法使用實(shí)例,本文講解了concat方法的用法及使用實(shí)例,需要的朋友可以參考下
    2015-04-04
  • 使用lua實(shí)現(xiàn)split字符串分隔

    使用lua實(shí)現(xiàn)split字符串分隔

    Lua腳本可以很容易的被C/C++代碼調(diào)用,也可以反過來調(diào)用C/C++的函數(shù),這使得Lua在應(yīng)用程序中可以被廣泛應(yīng)用。不僅僅作為擴(kuò)展腳本,也可以作為普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和維護(hù)。
    2014-11-11
  • ubuntu 14.04下熟悉lua的語法

    ubuntu 14.04下熟悉lua的語法

    擺在本人目前來說最大的困難就是迅速熟悉Lua語言,后續(xù)的一切工作才有可能,所以必須現(xiàn)在電腦上安裝好Lua開發(fā)環(huán)境,之后program with Lua,我們先來熟悉下lua的語法吧。
    2015-04-04
  • Lua5.1中加載dll動態(tài)鏈接庫的方法

    Lua5.1中加載dll動態(tài)鏈接庫的方法

    這篇文章主要介紹了Lua5.1中加載dll動態(tài)鏈接庫的方法,本文講解了加載專門為lua寫的擴(kuò)展dll的方法和加載不是專為lua寫的擴(kuò)展dll的方法,需要的朋友可以參考下
    2015-05-05
  • Golang使用ChatGPT生成單元測試實(shí)踐

    Golang使用ChatGPT生成單元測試實(shí)踐

    這篇文章主要為大家介紹了Golang使用ChatGPT生成單元測試實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Lua table中安全移除元素的方法

    Lua table中安全移除元素的方法

    這篇文章主要介紹了Lua table中安全移除元素的方法,本文給出3種實(shí)現(xiàn)方法,分別是從后往前刪除和while刪除,需要的朋友可以參考下
    2015-06-06

最新評論