【问题标题】:How can you pass a variable to a function and change the original variable within the function?如何将变量传递给函数并更改函数中的原始变量?
【发布时间】:2016-12-02 23:22:13
【问题描述】:

我是来问你一个函数如何设置一个参数传递的变量:

y = 4
test(y)

function test(x)
   x = 3
end

提前谢谢你。

【问题讨论】:

  • 我很好奇你为什么需要这个?
  • 你只需要进入 Lua 的不同思维模式(不仅仅是 Lua——每种语言都有自己的思维模式,即使某些语言有共同的做事“思想”)。 Lua 的方法是允许一个函数返回多个值,而这又可以用于通过简单地返回修改后的值来更新任何参数,并将其(从函数外部)重新分配给所需的变量。在我看来,这是一种“更清洁”的做事方式。您描述的方式(在许多语言中允许)实际上有点冒险,因为您可能不会期望隐式变量更改。
  • 除了关于语言和函数设计的哲学观点之外,从技术上讲,您的前提是不正确的:您不是在传递变量,而是在传递从表达式派生的值。你的表达恰好很简单y。然后在函数y 内部是一个参数,因此是一个不同的局部变量。关于改变参数的值或任何“变量”的值有更多的哲学论据。
  • 具有类 Pascal 语言背景的人可能习惯于使用 'var' 声明参数(实际上是指向实际变量的指针,但没有像 C 中那样显式使用指针语法),然后从函数内部对这些变量的任何更新都会更新函数中传递的原始变量。

标签: lua


【解决方案1】:

根据我目前对 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

【讨论】:

  • 谢谢,只是想知道是否可能,今天大多数语言都这样做,我问自己是否可能:)
  • @MatteoGuglielmetti 也许您可以使用debug 获得原始变量名,但我不推荐它。 Lua 是一门非常简单的语言,不要指望它会做一些主要语言做的事情 ;)
  • @MatteoGuglielmetti stackoverflow.com/a/1416843/5557841 - 所以,这是可能的,但不推荐。
  • @MatteoGuglielmetti 大多数语言都禁止这样做,至少对于简单值而言。结构(广义上的结构,这里是 lua 表)通常表现不同
  • 谢谢你们,我以前不知道,但为什么不推荐呢?
猜你喜欢
  • 2015-04-19
  • 2011-02-14
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多