1

C#とLuaInterfaceを使用して、ネストされたテーブルを読み取ろうとしていますが、テーブルを含むキーを開こうとすると、nullの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がnullであるため、例外があります。

事実上、キー(在庫アイテム)を列挙したら、ネストされたテーブルにドリルダウンして、それらのコンテンツを操作したいと思います。ご覧のとおり、ネストされたテーブルへの参照を私が行っている方法で取得することはできません。

4

3 に答える 3

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[]()が不十分です。あなたは1つの欠点を見つけました。実際にドットが含まれているキーを検索しようとすると、別のキーが表示されます(これは合法的な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プログラマーにとってはバグのように見えますが)。

于 2010-03-28T11:49:26.497 に答える
2

Luainterfaceについてはわかりませんが、構文は

DB.Inventory.10001

標準のLuaでは有効な構文ではありません。やってみました

DB.Inventory[10001]

標準のLuaではどちらが正しいでしょうか?

于 2010-03-26T23:02:45.403 に答える
0

@Robert Kerr、在庫番号をどのように知ることができますか? 10001、10021、10075? 返されるテーブルが DB インベントリの固定形式であることがわかっているため、INV_NUM 行数

外側の DB.inventory を反復するループと、各 INV_NUM テーブルを反復する 2 番目のループの 2 つのループを使用できます。

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

これは、文字列以外のキーでも機能します。

于 2014-05-17T09:20:15.680 に答える