使用C#和LuaInterface,我试图读取一个嵌套表,但是当我尝试打开包含该表的键时,我得到一个空的LuaTable。
.lua文件:
DB = {
["inventory"] = {
[10001] = {
["row"] = 140,
["count"] = 20,
},
[10021] = {
["row"] = 83,
["count"] = 3,
},
[10075] = {
["row"] = 927,
["count"] = 15,
},
}
}
我可以通过以下方式打开该表来成功预览库存下的条目:
LuaTable tbl = lua.GetTable("DB.inventory");
foreach (DictionaryEntry de in tbl)
...
我不能做的是打开一个库存项目并以相同的方式枚举其条目。这是因为密钥是System.Double
类型吗?这失败了:
LuaTable tbl = lua.GetTable("DB.inventory.10001");
foreach (DictionaryEntry de in tbl)
有异常,因为tbl为null。
实际上,一旦我枚举了密钥(库存项目),我就想深入了解嵌套表并使用这些内容。正如您所看到的,我无法按照我的方式获得对嵌套表的引用。
答案 0 :(得分:3)
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对其operator[]()
采用点分隔字符串参数的方式不足。你发现了一个缺点;如果你试图查找一个实际上有一个点的密钥(这是合法的Lua - 虽然不是惯用的,有时你会发现当表达密钥的最自然方式不是某种东西时,会出现另一个看起来像C标识符。)
LuaInterface应该提供的是一种采用字符串以外的类型的索引方法。既然没有,你可以像这样重写你的表:
DB = {
["inventory"] = {
["10001"] = {
["row"] = 140,
["count"] = 20,
},
["10021"] = {
["row"] = 83,
["count"] = 3,
},
["10075"] = {
["row"] = 927,
["count"] = 15,
},
}
}
我认为这会奏效。请注意,Norman Ramsey的建议,虽然完全适合Lua,但会在LuaInterface中打破,因此您应该像以前一样使用点进行索引(尽管这看起来像任何普通Lua程序员的错误)。
答案 1 :(得分:2)
我不知道Luainterface,但语法
DB.Inventory.10001
在标准Lua中不是有效语法。你试过吗
DB.Inventory[10001]
哪个在标准Lua中是正确的?
答案 2 :(得分:0)
@Robert Kerr, 您如何知道库存编号? 10001,10021和10075? 因为您知道返回的表格是固定格式的 D B 库存 INV_NUM 行 计数
你可以有两个循环,一个循环遍历外部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
这也适用于非字符串键。