2013-11-29 17 views
2

我想要做這樣的事情:返回從C#方法的Lua表而不將其添加到全局堆棧

table1 = myFunc("Arg1") 
table2 = myFunc("Arg2") 

for key,value in pairs(table1) do print(key,value) end 
for key,value in pairs(table2) do print(key,value) end 

我能夠添加表使用類似的語法Lua全球範圍內這樣的:

pLuaVM.NewTable("test"); 
((LuaTable)pLuaVM["test"])["A"] = 1; 
((LuaTable)pLuaVM["test"])["B"] = 2; 

然後訪問該表做在lua

for key,value in pairs(test) do print(key,value) end 

但我RA有我的方法返回表的本地變量,然後我可以使用。

這是可能的/我在正確的方向嗎?

回答

1

下應該工作(但沒試過):

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

public LuaTable YourExportedFunction(string arg) 
{ 
    var table = CreateTable(); 
    table["A"] = arg; 
    table["B"] = 123; 
    return table; 
} 

然後從Lua:

yourTable = YourExportedFunction("arg1") 

但是,如果不工作,我不知道你怎麼能避免全局,雖然你可以通過適配器功能隱藏它:

-- lua: 
function myFunc(arg) 
    MyCsFunc(arg) 
    local tt = csFuncTable -- bind to table ref'd by csFuncTable 
    csFuncTable = nil -- remove from globals 
    return tt 
end 
t1 = myFunc('arg1') 
t2 = myFunc('arg2') 

// C#: 
public void MyCsFunc(string arg) { 
    lua.NewTable("csFuncTable") 
    // ... populate table, say 
    LuaTable table = lua.GetTable("csFuncTable") 
    table[arg1] = 123 
} 

lua.RegisterFunction(...MyCsFunc...) 

你可以多次調用myFunc,因爲每次都是cs FuncTable全局被設置爲一個新表。全局只有在調用myFunc時才存在。邊境偷偷摸摸:)