LuaInterface - функция, которая будет возвращать значение LuaTable

Кто-нибудь знает, как написать функцию C#, которая будет возвращать значение LuaTable (например, {1 = "example1", 2 = 234, "foo" = "Foo Example"}? Все типы, которые я проверял, возвращаются LuaUserData значения, которые не являются парами /ipairable. Заранее спасибо.

--update-- На мой взгляд, ближайший тип к luaTable - ListDictionary:

        [LuaFunc(Name = "table", Desc = "returns test LuaTable", Params = new string[] { })]
    public System.Collections.Specialized.ListDictionary table()
    {
        var k = new System.Collections.Specialized.ListDictionary(){
            {"1",1},
            {2,"2"}
        };

        return k;
    }

Но он все еще распознается в Lua как LuaUserData и не может быть пара /ipaired

3 ответа

Решение

Есть два возможных решения этой проблемы.

Во-первых, позволить Луа вернуть стол:

LuaTable lt = (LuaTable) lua.DoString("return {1 = "example1", 2 = 234, "foo" = "Foo Example"}")[0];

Вторая возможность - создать новую таблицу.

LuaTable lt = lua.NewTable("ThisTable")
lt["1"] = "example1"
lt["2"] = 234
lt["foo"] = "Foo Example"

Вы можете получить доступ ко второму столу из Lua через

ThisTable[1] = ThisTable["foo"]

JCH2k прав. NewTable не имеет возвращаемого типа!

Используя логику JCH2k, я смог сделать эту функцию для преобразования aC# Point в LuaTable.

public LuaTable ConvertPointToTable(Point point)
{
return (LuaTable)lua.DoString("return {" + point.X + ", " + point.Y + "}")[0];
}

Чтобы использовать один раз, вернитесь в Lua.

local x = val[1]
local y = val[2]

user1829325 предоставил отличные подходы, хотя они не компилируются без изменений.
lua.DoString возвращает массив, lua.NewTable ничего не возвращает.

Но это привело меня к следующему решению, которое работает отлично, так что +1 в любом случае!

public LuaTable CreateTable()
{
    return (LuaTable)lua.DoString("return {}")[0];
}

Функция A C#, возвращающая таблицу, которая должна быть вызвана из Lua, может выглядеть так:

LuaTable newtable = CreateTable();
table["lala"] = 5;
return table;

Я также написал функцию маршала, которая преобразует словарь в LuaTable, используя мою функцию выше:

private LuaTable MarshalDictionaryToTable<A,B>(Dictionary<A, B> dict)
{
    LuaTable table = runner.CreateTable();
    foreach (KeyValuePair<A, B> kv in dict)
        table[kv.Key] = kv.Value;
    return table;
}
Другие вопросы по тегам