Чтение вложенной таблицы Lua с ключом System.Double - PullRequest
1 голос
/ 27 марта 2010

Используя 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 равно нулю.

По сути, после того, как я перечислю ключи (предметы инвентаря), я хочу развернуть вложенную таблицу и поработать с этим содержимым. Как видите, я не могу получить ссылку на вложенную таблицу так, как я это делаю.

Ответы [ 3 ]

3 голосов
/ 28 марта 2010

Похоже, что 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, будет нарушено в LuaInterface, поэтому вы должны индексировать только с точками, как и раньше (несмотря на то, что это будет выглядеть как ошибка для любого нормального программиста Lua).

2 голосов
/ 27 марта 2010

Я не знаю о Luainterface, но синтаксис

DB.Inventory.10001

недопустимый синтаксис в стандартном Lua. Вы пробовали

DB.Inventory[10001]

что было бы правильно в стандартном Lua?

0 голосов
/ 17 мая 2014

@ Роберт Керр, Как бы вы узнали инвентарные номера? 10001, 10021 и 10075? Так как вы знаете, что таблица возвращается в фиксированном формате база данных инвентарь 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

Это работает и с нестроковыми ключами.

...