1. 程式人生 > 其它 >Lua中__index元方法的介紹與使用

Lua中__index元方法的介紹與使用

一、相關介紹請參考:Lua中__index原方法介紹

二、使用示例

程式碼如下

下面示例使用的元素迭代器

--1.列表元素迭代器,僅返回列表中每一個元素,改列表索引必須為連續的數字
function listIterator(list)
    local index = 0;
    local listLen = #list
    return function ()
        index = index + 1
        if index <= listLen then
            return list[index]
        end
    end
end
--當作這是一個類
paramentClass = {id = "1", num = 1}
function paramentClass:new(obj, objId, objNum)
    obj = obj or {}             --如果初始化物件為空,建立一個新的表
    setmetatable(obj, self)     --設定元表,相當於定義結構,指定表地址
    --(1)設定預設域,相當於設定結構中成員的預設值;
    --(2)這裡self是隱藏的第一引數,代表呼叫方法的自身,這裡就是元表paramentClass這個表
    --(3)所以這裡可以寫成paramentClass.__index = paramentClass
self.__index = self self.id = objId self.num = objNum return obj end --當作這是一個表 operationList = {} function operationList:add(oId, onum) table.insert(self, paramentClass:new(nil, oId, onum)) end function operationList:add2(oId, onum) table.insert(self, {id = oId, num = onum})
end --下面是向表operation中插入資料及輸出結果 operationList:add("test1", 100) operationList:add2("test2", 200) operationList:add("test3", 300) --這裡同時修改了“test1”的值 for thisoL in listIterator(operationList) do print("this ID is "..thisoL.id.."\nthis Num is "..thisoL.num) end

輸出結果:

注:值得注意的是,在上述示例中,我們通過示例的輸出可以看到,當我們多次修改paramentClass的值,那麼之前paramentClass也會隨之改變,這是因為paramentClass的元地址始終都是指向本身,這裡可以理解為系統記憶體中只分出了一個用於存放paramentClass值的地址,所以無論我們怎麼重複呼叫修改,遠了引用到paramentClass的值也會隨之改變