如何识别变量?

时间:2017-09-28 21:01:33

标签: arrays lua

我知道这还没有完成,但我无法识别变量。我有 文件x中的变量。 对不起,这是计算机技术我试图让乌龟下来并保持它的位置,这是我的第一次编码。

function getx()
    local rx = fs.open("x", "r")
    local hx = rx:readLine() 
    print(hx)
end

function don()
    getx()
    while hx > 10 do
        ddd()
    end
end

function ddd()
    turtle.down()
end

1 个答案:

答案 0 :(得分:1)

您的问题出在scoping。一个函数中定义的变量不能从另一个函数中看到。

调用getx时,变量hx仅在其中被记住,有三种方法可以解决此问题。

共享本地变量

local hx;
function getx()
    local rx = fs.open("x", "r")
    hx = rx:readLine()
    print(hx)
end

function don()
    getx()
    while hx > 10 do
        ddd()
    end
end

function ddd()
    turtle.down()
end

此处更改的是hx已在dongetx共享的范围内声明,因此在调用getx时,hx已存储,don仍然可以访问它。

全局引用变量。

function getx()
    local rx = fs.open("x", "r")
    hx = rx:readLine()
    print(hx)
end

function don()
    getx()
    while hx > 10 do
        ddd()
    end
end

function ddd()
    turtle.down()
end

如果不将hx声明为本地,则会在全局范围内使用它,所有函数都可以访问。未明确声明为local的变量将始终使用此范围。

返回hx,并使用它。

function getx()
    local rx = fs.open("x", "r")
    local hx = rx:readLine()
    print(hx)
    return hx
end

function don()
    getx()
    while hx > 10 do
        ddd()
    end
end

function ddd()
    turtle.down()
end

或更好......

function getx()
    local rx = fs.open("x", "r")
    local hx = rx:readLine()
    print(hx)
    return hx
end

function don()
    while getx() > 10 do
        ddd()
    end
end

function ddd()
    turtle.down()
end

这是您应该针对此问题使用的解决方案

通过返回function中的值,您可以直接从调用它的位置获取变量。这更清洁,也更快。

避免您的下一个问题

每次运行fs.open时,您的代码实际上都会调用getx,因为这是ComputerCraftFS,每次都会从头开始读取文件,并且在崩溃之前导致内存泄漏。为避免这种情况,您只需打开一次文件,就像这样。

local rx = fs.open("x", "r")
function getx()
    local hx = rx:readLine()
    print(hx)
    return hx
end

function don()
    while getx() > 10 do
        ddd()
    end
end

function ddd()
    turtle.down()
end

getx的每次调用使用相同的文件引用,这意味着readLine()每次都会读取下一行。

您可以使用的其他优化措施如下所示。

local ddd = turtle.down     -- We don't need to define a new function, we can just make 'ddd' a reference to 'turtle.down'
local rx = fs.open("x", "r")
function don()
    local n = tonumber(rx:readLine())   -- The 'getx' function is not really needed anymore. 'tonumber' will make sure we're handling a number, not a string.
    while n and n > 10 do -- If tonumber doesn't get handed a string that looks like a number, it will return 'nil'. This checks if it's it's nil before seeing if it's greater than 10.
        ddd()
    end
end

快乐的制作!