我正在尝试修改可变参数函数内的数组集合。在尝试添加到阵列时,我最终会处理副本,并且在调用后它们会丢失。在Lua中有没有办法通过ref传递值?
function myfunc(...)
local args = {...}
--do work on args--
end
“do work”实际上并没有做任何事情,但它在函数之外工作就好了。
显然我可以传递一个数组数组而不使用......但是这有点打败了使用的目的......
答案 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