如何将变量传递给函数并在函数内部更改原始变量?

3

我来询问您如何使一个函数设置通过参数传递的变量:

y = 4
test(y)

function test(x)
   x = 3
end

Thank you in advance.


我很好奇你为什么需要这个? - Yates
你只需要切换到不同的思维方式,就能够理解Lua(不仅是Lua,每种编程语言都有自己的思维方式,即使某些编程语言共享一种通用的“思考”方式)。Lua的方式是允许函数返回多个值,并且可以通过返回修改后的值来更新任何参数,然后(在函数外部)重新赋值给所需的变量。在我看来,这是一种更加“清晰”的做法。你描述的方式(在许多编程语言中允许)实际上有一定风险,因为你可能不会预料到一个隐式的变量更改。 - tonypdmtr
除了关于语言和函数设计的哲学观点之外,从技术上讲,您的前提是不正确的:您没有传递一个变量,而是传递了从表达式中派生的值。您的表达式只是非常简单的 y。然后在函数内部,y 是一个参数,因此是一个不同的局部变量。关于更改参数的值或任何“变量”的价值还有更多的哲学论点。 - Tom Blodget
具有类似Pascal语言背景的人可能习惯于使用“var”声明参数的可能性(实际上是指向实际变量的指针,但不像C语言中那样显式地使用指针语法),然后在函数内部更新这些变量的任何更新都会更新传递给函数的原始变量。 - tonypdmtr
1个回答

0

根据我目前对Lua的了解,仅使用Lua是不可能实现这一点的。您需要深入研究http://metalua.luaforge.net/才能实现此目的。也许我错了,但我认为除非您提供变量名,否则无法仅使用纯Lua实现。

我很好奇您为什么需要这样做,因为我不知道为什么不能推荐最佳解决方案,但您可以简单地返回该值:

function test()
    return 5
end

x = 0
print(x) -- prints 0
x = test()
print(x) -- prints 5

如果您可以接受将变量作为字符串传递,您也可以这样做:
function test(y)
    _G[y] = 5
end

x = 0
print(x) -- prints 0
test("x")
print(x) -- prints 5

谢谢,我只是想知道是否可能,大多数编程语言今天都可以做到,所以我在想是否可能 :) - Matteo Guglielmetti
@MatteoGuglielmetti 或许可以通过使用 debug 获取原始变量名称,但我不建议这么做。Lua是一种非常简单的语言,不要期望它执行像某些主流语言那样的操作 ;) - Yates
@MatteoGuglielmetti https://dev59.com/t3M_5IYBdhLWcg3wWRoF#1416843 - 所以,这是可能的,但不建议这样做。 - Yates
@MatteoGuglielmetti 大多数编程语言都禁止这样做,至少对于简单的值来说是如此。结构(在广义上指的是结构,例如lua表)通常会有不同的行为。 - Jacek Cz
谢谢大家,我之前不知道这个,但为什么它不被推荐使用呢? - Matteo Guglielmetti
@MatteoGuglielmetti,仅仅因为它是一个调试器并且用于调试。如果你不能在不使用“debug”情况下实现某些功能,那么这可能就不是应该实现的。https://www.lua.org/pil/23.html - “[..]一些功能并不以性能著称。其次,它打破了语言的一些神圣真理[..]” - Yates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接