【问题标题】:Read nested Lua table who key is a System.Double读取嵌套的 Lua 表,其中键是 System.Double
【发布时间】:2014-05-17 17:20:15
【问题描述】:

使用 C# 和 LuaInterface,我试图读取一个嵌套表,但是当我尝试打开包含该表的键时得到一个空 LuaTable。

.lua 文件:

DB = {
    ["inventory"] = {
        [10001] = {
            ["row"] = 140,
            ["count"] = 20,
        },
        [10021] = {
            ["row"] = 83,
            ["count"] = 3,
        },
        [10075] = {
            ["row"] = 927,
            ["count"] = 15,
        },
    }
}

我可以通过以下命令打开该表成功地 foreach 库存下的条目:

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 为空。

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

【问题讨论】:

  • 我在每行代码前放了4个空格,但是我提交的时候,它们都被去掉并压缩了。

标签: c# lua luainterface


【解决方案1】:

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 程序员来说都是一个错误)。

【讨论】:

  • 我明白了。希望我对 lua 表有影响,我会按照你的建议做,将键更改为字符串。
  • 哎哟。假设 LuaInterface 具有“执行此 Lua 文字代码”功能,您可以将您拥有的表格转换为您想要的表格。基本上只是遍历表,使用tbl[tostring(key)] = value 构建一个新表(加上分层执行此操作的逻辑)。
【解决方案2】:

我不知道Lua接口,但是语法

DB.Inventory.10001

在标准 Lua 中不是有效的语法。你试过了吗

DB.Inventory[10001]

在标准 Lua 中哪个是正确的?

【讨论】:

  • 试过了,没变。 tbl 仍然为空。
【解决方案3】:

@罗伯特·克尔, 你怎么知道库存编号? 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

这也适用于非字符串键。

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2013-06-03
    • 2011-09-17
    • 2021-10-09
    • 2020-05-05
    • 2014-08-27
    • 2014-01-23
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多