【问题标题】:The functions don't change the value of variables函数不会改变变量的值
【发布时间】:2019-08-28 23:53:29
【问题描述】:

我尝试用_G. 声明变量,并在函数的末尾放置一个return 语句,就在最后一个“结束”之前。第一个给了我一个错误,另一个没有解决任何问题。

X = 0
Y = 0
Z = 0
BedrockLevel = 0
CurrentLayer = 5
succsess = true


function DigDown(BedrockLevel, CurrentLayer, Z, succsess)
    while BedrockLevel == 0 do
        succsess = turtle.digDown()
        if succsess == false then
            succsess = turtle.down()
            if succsess == false then
                BedrockLevel = Z - 1
            else
                Z = Z - 1
            end
        end
        succsess = turtle.down()
        if succsess == true then
            Z = Z - 1
        end
    end
    while Z < BedrockLevel + CurrentLayer do
        succsess = turtle.up()
        if succsess == true then
            Z = Z + 1
        end
    end
    return BedrockLevel, CurrentLayer, Z, succsess
end


DigDown(BedrockLevel, CurrentLayer, Z, succsess)
print(BedrockLevel, X, Y, Z)

预期结果是:打印功能显示:-10 0 0 5,

但它说的是 0 0 0 0。

由于这是在代码顶部分配的值,因此我假设函数不会更改它,即使有 return 语句。

【问题讨论】:

    标签: lua


    【解决方案1】:

    您的问题与如何将值传递给函数以及如何返回这些值有关。

    当您将值传递给函数并将其命名为与其他全局变量相同的名称时,您将拥有shadow the global variable。这意味着它几乎无法从函数内部访问。

    关于阴影的资源:

    Lua Shadowing example

    至于您的返回,您返回值但不将这些值分配给任何变量。您的调用应如下所示:

    BedrockLevel, CurrentLayer, Z, succsess = DigDown(BedrockLevel, CurrentLayer, Z, succsess)
    

    或者您也可以像这样定义DigDown

    function DigDown()
    

    这不会影响全局变量,因此对BedrockLevel, CurrentLayer, Z, succsess 所做的任何更改都会反映在全局变量中。

    【讨论】:

    • 啊,坦克很多:) 我想我需要在函数中插入所需变量的名称,这样它就知道它们来自哪里。但是,如果将其留空就可以解决,那可能是有史以来解决任何问题的最简单方法:D
    • @NicoLindenlauf 我想指出全局变量并不总是最好的方法。我认为这个答案以及关于这个问题的其他人很好地解释了这些问题:stackoverflow.com/a/485020/7396148
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2023-03-21
    • 2020-09-19
    相关资源
    最近更新 更多