lua修改函数内部的数组

时间:2012-03-19 12:48:17

标签: lua

我正在尝试修改可变参数函数内的数组集合。在尝试添加到阵列时,我最终会处理副本,并且在调用后它们会丢失。在Lua中有没有办法通过ref传递值?

function myfunc(...)
local args = {...}
--do work on args--
end

“do work”实际上并没有做任何事情,但它在函数之外工作就好了。

显然我可以传递一个数组数组而不使用......但是这有点打败了使用的目的......

2 个答案:

答案 0 :(得分:2)

在Lua中,您不能只选择通过引用传递变量。基本类型永远不会通过引用传递(如数字和布尔值),其他类型总是通过引用传递(如表,userdata和字符串)。在字符串的情况下,这并不重要,因为它们无论如何都是不可变的。

因此,要么将您想要全局工作的参数传递给像这样的字符串:

a=2
b=3
function myfunc(...)
   local args={...}
   for k,v in pairs(args) do
       _G[v]=_G[v]+k
   end
end
myfunc('a')
print(a) -- 3
myfunc('a','b')
print(a,b) -- 4    5

请注意,这仅适用于全局变量,因为本地变量不会保存在表格中。

使用表格可以减轻这种情况:

function myfunc(t)
    for k,v in pairs(t) do
           t[k]=v+k
    end
end
tab1={a=2}
myfunc(tab1)
print(tab1.a) -- 3
tab2={a=2,b=3}
myfunc(tab2)
print(tab2.a,tab2.b) -- 3    5

答案 1 :(得分:0)

使用...的目的是将整个参数列表分组到一个变量中。这与参数的by-reference或by-value性质没什么关系。

Lua中的所有自然类型都是按值传递的,表是唯一的例外。

执行所需操作的最简单方法是传递一组数组。如果两个额外的字符看起来太多,请知道你可以删除括号:

foo({a,b,c})
foo{a,b,c} -- equivalent