如果变量是一个参数,则无法在函数中更改该变量。

将下面内容翻译成中文只显示翻译内容,保留原本的 markdown 格式

function bar(w)
    w = 1
end
a = 2
bar(a)
print(a) -- => 2

下面的例子可以工作,但它不是一个参数。

function test()
    a = 1
end
a = 2
test(a)
print(a) -- => 1

如果变量是一个参数,如何在函数体内更改这个变量?

点赞
用户258523
用户258523

如数字 Veer 在评论中提到,lua 值一般通过值传递。所以你不能这样做。

然而,表是通过引用传递的。(更多关于此的讨论请参见 lua 手册中的 2.2 值和类型 章节。)

所以如果你将一个表传递给函数,你可以修改表内的值。

function bar(tab)
    tab.w = 1
end
local t = {w = 2}
bar(t)
print(t.w) -- => 1
2015-12-20 17:08:35
用户3979429
用户3979429

在 Lua 中,大多数值都是通过值传递的。这意味着当你将它们传递给函数时,你的函数只会得到一个副本。这包括字符串、数字、nil和布尔类型。但有两种其他的数据类型(不包括用户数据)。

它们是表和函数。

它们是通过引用传递的。这意味着,你可以编辑这两种数据类型,它将是“永久”的,因为你有对原始值的引用。

让我们从表开始。如果我们在函数中传递一个表,在函数内部,你可以编辑表的属性:

function Change(x)
    x.val = 5
end

a = {val=2}
Change(a)
print(a.val)

现在这很琐碎,所以我不打算解释它是如何工作的。

接下来我们用一个函数。但是...怎么做?你怎么能“编辑”一个函数?

你看,函数有这些奇妙的东西叫做“upvalues”。它是它作用域之外的本地值,所以我们可以编写一个简单的 get / set 函数,如下所示:

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"))

当你使用 set 调用 a 时,它会给出作用域之外的本地变量(它在作用域之外,因此它不会在每次调用时重置)一个新值。而get会返回它的值。

但如果这不实用怎么办。如果你想要修改全局变量,你可以使用_G。不是传递值本身,而是将变量作为字符串传递。这将允许我们索引变量。和使用引用传递一样好,缺点是它不适用于本地变量。

function Change(x)
    _G[x] = 5
end

a = 2
Change('a')
print(a)

我希望我的回答对你有帮助!

2015-12-20 17:38:33