2010-03-26 47 views
1

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

的.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是空的。

实际上,一旦枚举了键(库存项),我就想深入嵌套表并处理这些内容。正如你所看到的,我无法像我这样做得到对嵌套表的引用。

+0

我在每行代码前放了4个空格,但是当我提交时,它们全部被删除并压缩。 – 2010-03-26 22:58:12

回答

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, 
     }, 
    } 
} 

我认为这样会起作用。请注意,诺曼拉姆齐的建议,虽然完全适合适当的Lua,但会在Lua界面中突破,所以您应该像以前一样仅使用点索引(尽管这对于任何普通Lua程序员来说都会是一个错误)。

+0

我明白了。希望我对卢阿表有影响力,我会按照你的建议去做,把钥匙换成字符串。 – 2010-03-29 06:45:01

+0

哎。假设LuaInterface具有“执行此文字Lua代码”功能,您可以将您拥有的表格转换成您想要的表格。基本上只是对表进行迭代,用'tbl [tostring(key)] = value'(加上逻辑来分层执行)建立一个新表。 – 2010-04-03 23:29:52

2

我不知道Luainterface,但语法

DB.Inventory.10001 

不标准的Lua有效的语法。您是否尝试过

DB.Inventory[10001] 

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

+0

试过,没有变化。 tbl仍然为空。 – 2010-03-27 01:28:19

+0

那么,那个'lua.GetTable'是非标准的 - 我会追查它的文档... – 2010-03-27 20:05:20

0

@Robert Kerr, 您如何知道库存数量? 10001,10021和10075? 既然你知道,返回的表是 DB 库存 INV_NUM 行 数的固定格式

可以有两个回路,一个是通过外DB迭代。通过每个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

这适用于非字符串键以及库存,第二是迭代。