Function 如果变量是变量,则无法更改函数中的变量
下一个是工作,但不是争论Function 如果变量是变量,则无法更改函数中的变量,function,variables,lua,arguments,Function,Variables,Lua,Arguments,下一个是工作,但不是争论 function bar(w) w = 1 end a = 2 bar(a) print(a) -- => 2 如何更改函数体中的变量?变量是参数吗?由于注释中指示的数字转向,lua值通常按值传递。所以你不能这么做 但是,表是通过引用传递的。有关这方面的更多讨论,请参阅lua手册中的章节 因此,如果将表传递到函数中,则可以修改表内的值 function test() a = 1 end a = 2 test(a) print(a) -- =>
function bar(w)
w = 1
end
a = 2
bar(a)
print(a) -- => 2
如何更改函数体中的变量?变量是参数吗?由于注释中指示的数字转向,lua值通常按值传递。所以你不能这么做 但是,表是通过引用传递的。有关这方面的更多讨论,请参阅lua手册中的章节 因此,如果将表传递到函数中,则可以修改表内的值
function test()
a = 1
end
a = 2
test(a)
print(a) -- => 1
在Lua中,大多数值都是按值传递的。也就是说,当你把它们传递给一个函数时,你的函数只是一个副本。这包括字符串、数字、nil和布尔值。但除了userdatas之外,还有另外两种数据类型 表和函数 它们是通过参考来传递的。这意味着,您可以编辑这两个数据类型,并且它将是“永久的”,因为您有一个对原始值的引用 让我们从桌子开始。在您的函数中,如果我们传递一个表,您可以改为编辑属性:
function bar(tab)
tab.w = 1
end
local t = {w = 2}
bar(t)
print(t.w) -- => 1
现在这是微不足道的,所以我不想费心解释它是如何工作的
接下来让我们使用一个函数。但是怎样如何“编辑”函数
你看,函数有这些神奇的东西叫做“upvalue”。本地值超出其范围,因此我们可以编写一个简单的get/set函数,如下所示:
function Change(x)
x.val = 5
end
a = {val=2}
Change(a)
print(a.val)
当你调用with集合时,你给它的作用域之外的局部变量它在作用域之外,所以它不会每次调用都重置一个新的值。我会把它还给你的
但如果这不实际呢。如果你想修改全局变量,你可以使用_G,而不是传递值本身,而是将变量作为字符串传递。这将允许我们索引变量。就像通过参考一样好,缺点是什么?这对当地人不起作用
function Change(x)
x("set", 5)
end
do
local val = 2
function a(method, v)
if method == "set" then
val = v
elseif method == "get" then
return val
end
end
end
Change(a)
print(a("get"))
我希望我的回答对你有帮助 这是因为在Lua中,通过值传递。这意味着您只是编辑参数的副本,而不是实际的参数本身。您可能会发现这个讨论很有用:答案很好地解释了Lua。但是,您可能会注意到术语“按值传递”、“按引用传递”等中的一些变化。它们最好是根据需要的上下文定义的,不同的语言有不同的需要。>你可以用,;所以对本地人来说没有办法吗?@Parki,正如我在回答中提到的,_G只有在您希望更改全局变量时才有用。您无法对其进行局部操作,但幸运的是,我提到了另外两种在本地工作的方法。所有Lua值都是通过值传递的-表引用也不例外。@如果为true,则表的值是对表的引用。尽管语义上的差异足以让这成为一个有意义的区别。
function Change(x)
_G[x] = 5
end
a = 2
Change('a')
print(a)