读取嵌套的Lua表,其中key是System.Double

时间:2010-03-26 22:57:10

标签: c# lua luainterface

使用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。

实际上,一旦我枚举了密钥(库存项目),我就想深入了解嵌套表并使用这些内容。正如您所看到的,我无法按照我的方式获得对嵌套表的引用。

3 个答案:

答案 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

这也适用于非字符串键。