Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如果变量是变量,则无法更改函数中的变量_Function_Variables_Lua_Arguments - Fatal编程技术网

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)