lua 元表理解 index

2021-10-01 02:01:42 字數 1402 閱讀 9881

lua 表的本質是乙個hasmap的東西,是乙個key-value的形式,除了nil,其他的任何值都能做key,在乙個lua表中去查詢乙個不存在的key的時候,就會觸發lua自己的一套查詢機制,同樣的繼承也是根據這個機制實現的。

1.什麼是元表:

我認為是乙個備用操作指南,這個指南裡面有很多方法,__index,__newindex,add,sub, 

__index 這個方法表示:如果查詢字段失敗,請來找我,按照我的操作走

__newindex這個方法表示:給字段更新賦值失敗,請來找我,按照我的操作走,其他指南類似。

這裡有乙個誤區,當a有乙個元表b,在a中沒有找到字段,就在b中查詢,這並不正確。

事實上是:a有乙個元表b,這只是有了這個指南,如果你在a中找到了,就跟指南沒有任何關係,

如果你沒有找到,這就需要元表了。嘿嘿,我現在查詢失敗了,怎麼辦,指南說你找__index方法,它知道

這個時候__index就說,按照我的操作走。

2.查詢機制:(查詢字段。1.首先在當前表中查詢,如果有則返回,如果沒有,

2.繼續查詢是否存在元表,如果沒有,返回nil,如果有,

3.繼續查詢元表的__index方法的索引,如果沒有,返回nil,如果有

4.繼續查詢__index方法所對應的值(__index方法的值可以是乙個表__index=,

也可以是乙個方法__index=function() return 10 end),如果__index對應的值是乙個表,則重複查詢,否則nil

大概機制是這樣的,還是看例子來的快

例1:

people = 

child =

setmetatable(child, people)

print(child.man)

列印結果   nil

我們在child中去找man,很明顯沒有,接著查詢元表,有元表是people,接著查詢__index方法所對應的值,這裡沒有設定,所以返回nil

例2:

people = 

people.__index = people -- 把people的__index方法指向自己

child =

setmetatable(child, people)

print(child.man)

列印結果   2

我們在child中去找man,很明顯沒有,接著查詢元表,有元表是people,接著查詢__index方法所對應的值,這裡把__index的值設定為people本身,所以去peopel中查詢man欄位,有man=2,則返回2

lua元表中的 index鍵值

學了元表,裡面的乙個很重要的鍵值 index 當我們通過鍵去訪問乙個表時,如果不存在這個鍵,lua還會嘗試搜尋表的元表的 index鍵值,沒有則返回nil 1.如果元表中的 index鍵對應的是表,直接搜尋鍵名,搜尋不到返回nil 2.如果元表中的 index鍵所對應的是函式,則呼叫函式並傳遞 表和...

lua元表理解

2015 08 23 22 13 237人閱讀收藏 舉報 lua 在lua中任何變數都有乙個元表 我相信每個字串元表都是string相關,所以可以使用string length 元表中特殊的值有特殊的含義,比如 index,call,add等等。函式setmetatable a,meta 就是將me...

Lua元表metatable理解

index元方法 總結 newindex 元方法 call 元方法 定義元方法 call 最近總是遇到如果通過指令碼語言搭建乙個oop結構,於是針對lua進行了解,發現需要用到其元表metatable來實現,則對lua的metatable進行乙個理解的整理 理解 名稱 元表,本身也是乙個table ...