ddxiami

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3371|回复: 5

Lua语法--13元表(Metatable)

[复制链接]
发表于 2020-8-19 21:59:45 | 显示全部楼层 |阅读模式
#__index 元方法
===============================================
#!/usr/local/bin/lua

mytable = setmetatable({key1 = "value1"}, {
  __index = function(mytable, key)
    if key == "key2" then
      return "metatablevalue"
    else
      return nil
    end
  end
})

print(mytable.key1,mytable.key2)
===============================================
回复

使用道具 举报

 楼主| 发表于 2020-8-19 21:59:54 | 显示全部楼层
#__newindex 元方法
===============================================
#!/usr/local/bin/lua

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)
===============================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-19 22:00:03 | 显示全部楼层
#rawset 函数来更新表
===============================================
#!/usr/local/bin/lua

mytable = setmetatable({key1 = "value1"}, {
  __newindex = function(mytable, key, value)
                rawset(mytable, key, "\""..value.."\"")

  end
})

mytable.key1 = "new value"
mytable.key2 = 4

print(mytable.key1,mytable.key2)
===============================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-19 22:00:19 | 显示全部楼层
#为表添加操作符
===============================================
#!/usr/local/bin/lua

-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用
-- 自定义计算表中最大键值函数 table_maxn,即计算表的元素个数
function table_maxn(t)
    local mn = 0
    for k, v in pairs(t) do
        if mn < k then
            mn = k
        end
    end
    return mn
end

-- 两表相加操作
mytable = setmetatable({ 1, 2, 3 }, {
  __add = function(mytable, newtable)
    for i = 1, table_maxn(newtable) do
      table.insert(mytable, table_maxn(mytable)+1,newtable[i])
    end
    return mytable
  end
})

secondtable = {4,5,6}

mytable = mytable + secondtable
        for k,v in ipairs(mytable) do
print(k,v)
end
===============================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-19 22:00:29 | 显示全部楼层
#__call 元方法
===============================================
#!/usr/local/bin/lua

-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用
-- 自定义计算表中最大键值函数 table_maxn,即计算表的元素个数
function table_maxn(t)
    local mn = 0
    for k, v in pairs(t) do
        if mn < k then
            mn = k
        end
    end
    return mn
end

-- 定义元方法__call
mytable = setmetatable({10}, {
  __call = function(mytable, newtable)
        sum = 0
        for i = 1, table_maxn(mytable) do
                sum = sum + mytable[i]
        end
    for i = 1, table_maxn(newtable) do
                sum = sum + newtable[i]
        end
        return sum
  end
})
newtable = {10,20,30}
print(mytable(newtable))
===============================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-19 22:00:40 | 显示全部楼层
#__tostring 元方法
===============================================
#!/usr/local/bin/lua

mytable = setmetatable({ 10, 20, 30 }, {
  __tostring = function(mytable)
    sum = 0
    for k, v in pairs(mytable) do
                sum = sum + v
        end
    return "表所有元素的和为 " .. sum
  end
})
print(mytable)
===============================================
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|技术文档库 ( 闽ICP备15017263号-2 )|网站地图

GMT+8, 2025-5-18 17:37 , Processed in 0.036349 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表