gpt4 book ai didi

c++ - 如何从 C++ 验证 Lua 表键

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:03 27 4
gpt4 key购买 nike

我正在尝试使用 Lua 来配置 C++ 应用程序,但在配置出现问题时无法生成有用的消息,而不是 Lua 语法。

例如,假设以下是一个有效的配置:

foo = { a = 0, b = 'bar' }

但用户实际输入的是:

foo = { a = 0, c = 'bar' }

现在,应用知道 foo 可以有字段 a 和 b。它可以加载 foo 并获取 a 的值。它甚至可以告诉 b 未设置并使用默认值。但我想检测到 c 存在并报告警告。

以下是我对爆炸的尝试的摘录:

static void check_table(lua_State* L)
{
lua_pushnil(L);

while ( lua_next(L, -2) )
{
// key at -2 and value at -1
if ( lua_isstring(L, -2) )
{
const char* key = lua_tostring(L, -2);
// validate here; just printing key for now
cout << key << endl;
}
lua_pop(L, 1);
}
}

只要表格实际上不是数组,这就可以正常工作。当我击中其中一个时,它会在第二次迭代时死掉:

...
1
PANIC: unprotected error in call to Lua API (invalid key to 'next')

我从 Lua 引用页面归因于此:

"If the value is a number, then lua_tolstring also changes the actual value in the
stack to a string. (This change confuses lua_next when lua_tolstring is applied to
keys during a table traversal.)"

有什么办法解决这个问题吗?我愿意接受其他方法。理想情况下,可以发出如下消息:

警告:conf.lua 第 18 行:表 foo 不使用键 'c',已忽略

(Lua 调试 API 也不提供文件名和行号,但那是另一个话题。)

PS:我知道,c 可能是良性的,但也可能是错字。在大型配置中,忽略这些事情可能会导致数小时的头痛。

最佳答案

如果用 Lua 编写,验证可能会容易得多。我有这样的想法:

local template = { a="number", b="string"}

local function validate(t)
for k,v in pairs(t) do
if template[k]==nil then
print("field "..k.." cannot be present")
elseif type(v)~=template[k] then
print("field "..k.." should be a "..template[k])
end
end
end

validate{ a = 0, b = 'bar' }
validate{ a = 0, b = 42 }
validate{ a = 0 }
validate{ a = 0, c = 'bar' }

关于c++ - 如何从 C++ 验证 Lua 表键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052579/

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