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的值也会随之改变

posted @ 2022-05-24 12:32  青丝·旅人  阅读(224)  评论(0编辑  收藏  举报