Lua语言学习-原表

菜鸟教程 https://www.runoob.com/lua/lua-metatables.html

 

Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。

例如,使用元表我们可以定义Lua如何计算两个table的相加操作a+b。

setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败

 

__index、__newindex、__add、__call、__tostring的实际使用

mytable = {1, 2, 3}

metatable_index = {}
my_metatable = {
    -- __index通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
    __index = function(tab, key)
        print(key)
        return 1
    end,

    -- __newindex 元方法用来对表更新。当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作
    -- __newindex为函数或者表,作用不一
    --__newindex = function(tab, key, val)
    --    print("设置的key为:", key)
    --    rawset(tab, key, val)
    --end,

    __newindex = metatable_index,

    -- __add tableA + tableB时候触发
    __add = function(tb1, tb2)
        local new_tb = {}
        for k, v in pairs(tb1) do
            new_tb[#new_tb + 1] = {k, v}
        end
        for k, v in pairs(tb2) do
            new_tb[#new_tb + 1] = {k, v}
        end
        return new_tb
    end,

    -- __call 当我们把表当成函数一样调用的时候,会调用__call的function
    __call = function(tab, arg1, arg2, arg3)
        print("__call ", arg1)
    end,

    -- __tostring元方法用于修改表的输出行为
    __tostring = function(mytable)
        sum = 0
        for k, v in pairs(mytable) do
                sum = sum + v
        end
        return "表所有元素的和为 " .. sum
    end,
}

setmetatable(mytable, my_metatable)

-- __index
print(mytable[6], metatable_index[6])

-- __newindex
mytable[6] = 3
print(mytable[6], metatable_index[6])

-- __add
a = {1, 2, 3}
setmetatable(a, my_metatable)
b = {4, 5, 6}

new_tb = a + b
for k, v in next, new_tb do
    print(k, v[1], v[2])
end


-- __call
mytable(3)

-- __tostring
print(mytable)

 

posted @ 2019-05-09 17:31  orxx  阅读(501)  评论(0编辑  收藏  举报