日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lua 元表/元方法

發(fā)布時間:2024/4/11 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lua 元表/元方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在lua中,每個值都有其對應(yīng)的操作,比如數(shù)值型有加減乘除等操作,字符串型有連接截取等操作,那么這些操作(加減乘除,連接截取等)定義在什么地方呢?定義在這些值默認的元表中,如果想修改這些操作(比如加法)就得修改其默認的元表,這樣一來整型值所有的加法操作都被修改了。

table和userdata型沒有默認元表,所以我們可以很容易修改其操作行為,比如對于table類型,我們是沒有加法操作的,即兩個table是不能夠相加的,如果這時候想實現(xiàn)其相加操作怎么辦呢,此時就可以為這兩個table每一個設(shè)置一個元表,在其對應(yīng)的元表中設(shè)置__add()函數(shù),?"__add" 是元表的鍵名(元表的鍵名也稱之為事件(event),一般以 2 個下劃線 "_" 開頭), "__add" 函數(shù)是這個相加操作的元方法(metamethod)。對于值的操作,Lua 都將其關(guān)聯(lián)上一個被稱作事件的指定健,當(dāng) Lua 需要對一個值發(fā)起這些操作中的一個時, 它會去檢查值的元表里是否有對應(yīng)事件。如果有,則鍵名對應(yīng)的值(元方法)將控制 Lua 怎樣去執(zhí)行這個操作,有人可能會有疑問,為什么相加操作用__add(),而不是其他,在此的解釋是鍵名是固定寫法,在lua中我們可以重定義的元方法有這些:


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
在執(zhí)行加法操作時(t = t1 + t2),首先檢查該+運算符的兩個table操作數(shù)的元表中是否有相加操作的元方法,如果沒有則會報錯,否則執(zhí)行。
上述是對執(zhí)行加法操作的元方法的舉例,其他的操作類似。除此之外還有幾個非常重要的元方法需要注意:__index,__newindex等。
__index用來對表進行訪問:
當(dāng)你通過鍵值對表進行訪問的時候,如果該鍵沒有值,則會查找對應(yīng)的元表中是否存在該鍵對應(yīng)的值,如果不存在則返回nil,否則返回__index對應(yīng)的值。

Lua查找一個表元素時的規(guī)則,遵循如下3個步驟:

  • 1.在表中查找,如果找到,返回該元素,找不到則繼續(xù)
  • 2.判斷該表是否有元表,如果沒有元表,返回nil,有元表則繼續(xù)。
  • 3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是一個表,則重復(fù)1、2、3;如果__index方法是一個函數(shù),則返回該函數(shù)的返回值。

__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) 以上輸出結(jié)果為

value1 nil 新值2 新值1 nil 以上實例中表設(shè)置了元方法 __newindex,在對新索引鍵(newkey)賦值時(mytable.newkey = "新值2"),會調(diào)用元方法,而不進行賦值。而如果對已存在的索引鍵(key1),則會進行賦值,而不調(diào)用元方法 __newindex。

以上只是對lua元表元方法的簡單總結(jié),如果想詳細了解其用法的可以參考以下這兩篇文章,個人認為寫的比較好,并且本文一部分內(nèi)容是借鑒以下兩位的:

http://www.runoob.com/lua/lua-metatables.html

http://dhq.me/lua-learning-notes-metatable-metamethod

總結(jié)

以上是生活随笔為你收集整理的lua 元表/元方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。