查看: 47|回复: 3

[Lua] 用元表实现只读表(ReadOnly)——保护配置数据不被污染

[复制链接]

46

主题

42

回帖

1212

积分

金牌会员

积分
1212
发表于 2026-6-5 00:00:06 | 显示全部楼层 |阅读模式
-- readonly.lua
-- 用元表拦截写操作,让配置表在运行时不可修改

local function readonly(t)
    return setmetatable({}, {
        __index    = t,
        __newindex = function(_, k, _)
            error("尝试修改只读表,键: " .. tostring(k), 2)
        end,
        __pairs    = function() return pairs(t) end,
        __len      = function() return #t end,
    })
end

-- 装备品质配置
local ITEM_QUALITY = readonly({
    [1] = { name = "普通", color = "white",  bonus = 0   },
    [2] = { name = "精良", color = "green",  bonus = 10  },
    [3] = { name = "稀有", color = "blue",   bonus = 25  },
    [4] = { name = "史诗", color = "purple", bonus = 50  },[5] = { name = "传说", color = "orange", bonus = 100 },
})

return ITEM_QUALITY

效果:

46

主题

42

回帖

1212

积分

金牌会员

积分
1212
楼主 发表于 2026-6-5 00:02:22 | 显示全部楼层
效果:
local cfg = require("ItemQualityConfig")

print(cfg[3].name)   -- 输出: 稀有  ✓
cfg[3].name = "测试" -- 报错: 尝试修改只读表,键: 3  ✓

-- 实际使用
function GetItemBonusRate(qualityId)
    local q = cfg[qualityId]
    if not q then return 0 end
    return q.bonus
end

25

主题

89

回帖

1323

积分

金牌会员

积分
1323
发表于 2026-6-5 10:29:25 | 显示全部楼层
看帖回帖是一种美德!

46

主题

42

回帖

1212

积分

金牌会员

积分
1212
楼主 发表于 2026-6-5 14:44:54 | 显示全部楼层

看帖回帖是一种美德!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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