gpt4 book ai didi

lua - 只读lua中的可迭代表?

转载 作者:行者123 更新时间:2023-12-04 16:46:23 26 4
gpt4 key购买 nike

我想在我的 Lua 程序中有一个只读表。如果删除了一个键或一个键与新值相关联,则必须抛出错误。

function readonly(table)
local meta = { } -- metatable for proxy
local proxy = { } -- this table is always empty

meta.__index = table -- refer to table for lookups
meta.__newindex = function(t, key, value)
error("You cannot make any changes to this table!")
end

setmetatable(proxy, meta)
return proxy -- user will use proxy instead
end

它工作得很好。
t = { }
t["Apple"] = "Red"
t[true] = "True!"
t[51] = 29

for k,v in pairs(t) do
print(v)
end

t = readonly(t)
t[51] = 30

打印
Red
True!
29
input:7: You cannot make any changes to this table!

问题
for k, v in pairs(t) do
print(v)
end

现在在任何情况下都不会打印任何内容。那是因为 proxy table 里面永远不会有任何东西。 pairs显然从不打电话 index因此无法从实际表中检索任何内容。

我该怎么做才能使这个只读表可迭代?

我在 Lua 5.1 上并且可以访问这些元方法:

Lua 5.1 Manual

最佳答案

您可以修改标准 Lua 函数 pairs与您的只读表正常工作。

local function readonly_newindex(t, key, value)
error("You cannot make any changes to this table!")
end

function readonly(tbl)
return
setmetatable({}, {
__index = tbl,
__newindex = readonly_newindex
})
end

local original_pairs = pairs

function pairs(tbl)
if next(tbl) == nil then
local mt = getmetatable(tbl)
if mt and mt.__newindex == readonly_newindex then
tbl = mt.__index
end
end
return original_pairs(tbl)
end

用法:
t = { }
t["Apple"] = "Red"
t[true] = "True!"
t[51] = 29

for k,v in pairs(t) do
print(k, v)
end

t = readonly(t)

for k,v in pairs(t) do
print(k, v)
end

t[51] = 30

关于lua - 只读lua中的可迭代表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47956954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com