lua 元表/元方法
在lua中,每個值都有其對應的操作,比如數值型有加減乘除等操作,字符串型有連接截取等操作,那么這些操作(加減乘除,連接截取等)定義在什么地方呢?定義在這些值默認的元表中,如果想修改這些操作(比如加法)就得修改其默認的元表,這樣一來整型值所有的加法操作都被修改了。
table和userdata型沒有默認元表,所以我們可以很容易修改其操作行為,比如對于table類型,我們是沒有加法操作的,即兩個table是不能夠相加的,如果這時候想實現其相加操作怎么辦呢,此時就可以為這兩個table每一個設置一個元表,在其對應的元表中設置__add()函數,?"__add" 是元表的鍵名(元表的鍵名也稱之為事件(event),一般以 2 個下劃線 "_" 開頭), "__add" 函數是這個相加操作的元方法(metamethod)。對于值的操作,Lua 都將其關聯上一個被稱作事件的指定健,當 Lua 需要對一個值發起這些操作中的一個時, 它會去檢查值的元表里是否有對應事件。如果有,則鍵名對應的值(元方法)將控制 Lua 怎樣去執行這個操作,有人可能會有疑問,為什么相加操作用__add(),而不是其他,在此的解釋是鍵名是固定寫法,在lua中我們可以重定義的元方法有這些:
在執行加法操作時(t = t1 + t2),首先檢查該+運算符的兩個table操作數的元表中是否有相加操作的元方法,如果沒有則會報錯,否則執行。
上述是對執行加法操作的元方法的舉例,其他的操作類似。除此之外還有幾個非常重要的元方法需要注意:__index,__newindex等。
__index用來對表進行訪問:
當你通過鍵值對表進行訪問的時候,如果該鍵沒有值,則會查找對應的元表中是否存在該鍵對應的值,如果不存在則返回nil,否則返回__index對應的值。
Lua查找一個表元素時的規則,遵循如下3個步驟:
- 1.在表中查找,如果找到,返回該元素,找不到則繼續
- 2.判斷該表是否有元表,如果沒有元表,返回nil,有元表則繼續。
- 3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是一個表,則重復1、2、3;如果__index方法是一個函數,則返回該函數的返回值。
__newindex用于對表進行更新。
在對一個表中不存在的索引賦值時,不會直接把該值加到該表中,而是會把該值加入到該表的元表中。
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) 以上輸出結果為 value1 nil 新值2 新值1 nil 以上實例中表設置了元方法 __newindex,在對新索引鍵(newkey)賦值時(mytable.newkey = "新值2"),會調用元方法,而不進行賦值。而如果對已存在的索引鍵(key1),則會進行賦值,而不調用元方法 __newindex。
以上只是對lua元表元方法的簡單總結,如果想詳細了解其用法的可以參考以下這兩篇文章,個人認為寫的比較好,并且本文一部分內容是借鑒以下兩位的:
http://www.runoob.com/lua/lua-metatables.html
http://dhq.me/lua-learning-notes-metatable-metamethod
總結
以上是生活随笔為你收集整理的lua 元表/元方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++对自定义结构体变量排序
- 下一篇: cocos工程里面“”invalid '