读取嵌套的 Lua 表格,其键为 System.Double。
使用 C#和 LuaInterface,我试图读取一个嵌套表,但在尝试打开包含表的键时,我得到一个空的 LuaTable。
.lua 文件:
DB = {
["inventory"] = {
[10001] = {
["row"] = 140,
["count"] = 20,
},
[10021] = {
["row"] = 83,
["count"] = 3,
},
[10075] = {
["row"] = 927,
["count"] = 15,
},
}
}
我可以成功地枚举存储在 inventory 下的条目,通过打开该表:
LuaTable tbl = lua.GetTable("DB.inventory");
foreach (DictionaryEntry de in tbl)
...
但我无法像枚举 inventory 条目时那样打开一个 inventory 条目并枚举它的条目。这是因为键是 System.Double 类型吗?这将失败:
LuaTable tbl = lua.GetTable("DB.inventory.10001");
foreach (DictionaryEntry de in tbl)
抛出一个异常,因为 tbl 是 null。
实际上,一旦我枚举键(inventory 条目),我就想深入嵌套的表并处理其中的内容。正如您所看到的,我无法以我所做的方式获取嵌套表的引用。
原文链接 https://stackoverflow.com/questions/2527310
看起来 LuaInterface 只支持字符串键。从它的 Lua.cs 可以看出,这个函数最终被你的代码调用:
internal object getObject(string[] remainingPath)
{
object returnValue=null;
for(int i=0;i<remainingPath.Length;i++)
{
LuaDLL.lua_pushstring(luaState,remainingPath[i]);
LuaDLL.lua_gettable(luaState,-2);
returnValue=translator.getObject(luaState,-1);
if(returnValue==null) break;
}
return returnValue;
}
请注意,这段代码调用 lua_pushstring()
将你索引的字符串分开传递,没有为不是字符串的键提供保障。
LuaInterface 采用点分隔的字符串参数的方法是有缺陷的。你已经发现了其中一个缺点;如果你试图查找包含点的键(这在 Lua 是合法的,尽管不是惯用法,有时候,像你发现的那样,表达键的最自然的方式并不是使用类似于 C 标识符的东西),另一个缺陷将会显现出来。
LuaInterface 应该提供一个接受字符串以外类型的键的索引方法。由于它没有,你可以像这样重新编写你的表:
DB = {
["inventory"] = {
["10001"] = {
["row"] = 140,
["count"] = 20,
},
["10021"] = {
["row"] = 83,
["count"] = 3,
},
["10075"] = {
["row"] = 927,
["count"] = 15,
},
}
}
我认为这会起作用。请注意,Norman Ramsey 的建议对于正确的 Lua 是完全合适的,但在 LuaInterface 中会出现问题,因此你应该仍然使用点(.)作为索引符号,就像以前一样(尽管这会看起来像一个 Bug,对于任何普通的 Lua 程序员来说)。
@Robert Kerr, 你如何知道Inventory Numbers?即10001、10021和10075? 由于您知道返回的表格是采用固定格式的DB、inventory、INV_NUM、row和count,因此可以使用两个循环,一个迭代外部DB.inventory,另一个迭代每个INV_NUM表
Dim tbl As LuaTable = lua.GetTable("DB.inventory")
For Each item As DictionaryEntry In tbl
Debug.Print("{0} = {1}", item.Key, item.Value)
Dim subTbl As LuaTable = item.Value
For Each subItem As DictionaryEntry in subTbl
Debug.Print(" {0} = {1}", subItem.Key, subItem.Value)
Next
Next
这也适用于非字符串键。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我不知道 Luainterface,但下面的语法
在标准的 Lua 中是无效的语法。你尝试过标准的 Lua 语法吗?
这个语法是正确的。