在函数内修改 Lua 数组

我正在尝试修改可变参数函数内部的一组数组。在尝试向数组添加内容时,我最终会在副本上工作,并在调用后丢失它们。有没有办法在Lua中通过引用传递值?

function myfunc(...)
local args = {...}
--对args执行操作--
end

“执行操作”实际上什么都没有做,但在函数外部它可以正常运行。

显然,我可以传递一个数组的数组并且不使用...,但是这种方法有点违背使用...的初衷。

原文链接 https://stackoverflow.com/questions/9770495

点赞
stackoverflow用户513763
stackoverflow用户513763

在 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
2012-03-19 13:05:57
stackoverflow用户312586
stackoverflow用户312586

使用...的目的是将整个参数列表分组到一个变量中。这与参数的按引用或按值的性质几乎没有关系。

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

实现你想要的最简单的方法是传递一个数组的数组。如果两个额外的字符看起来太多了,那么可以去掉括号:

foo({a,b,c})
foo{a,b,c} -- 等价的
2012-03-19 17:01:50