3

有谁知道如何编写一个返回 LuaTable 值的 C# 函数(例如{1 = "example1", 2 = 234, "foo" = "Foo Example"}?我测试过的所有类型都返回LuaUserData不可配对/可配对的值。提前致谢。

--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 并且不能配对/配对

4

3 回答 3

3

这个问题有两种可能的解决方案。

首先是让 Lua 返回表:

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"]
于 2013-01-22T13:59:33.023 回答
0

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]
于 2013-11-04T01:33:23.703 回答
0

user1829325 提供了很好的方法,尽管它们不经过修改就无法编译。
lua.DoString 返回一个数组, lua.NewTable 不返回任何内容。

但这使我得到了以下解决方案,该解决方案运行完美,所以无论如何+1!

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

返回应该从 Lua 调用的表的 AC# 函数可能如下所示:

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

我还编写了一个 marshall 函数,它使用上面的函数将 Dictionary 转换为 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;
}
于 2013-08-28T11:44:00.437 回答