Попытка сравнить строку с номером - компьютерный

    local level = 3 -- Required access level
local sideIn = "bottom" -- Keycard Input Side
local sideOut = "right" -- Redstone output side
local rsTime = 3 -- Redstone time
while true do
if disk.isPresent(sideIn) then
        term.clear()
        term.setCursorPos(1,1)
        local code = fs.open("disk/passcode.lua", "r").readAll()
        if code == nil then
        local code = 0
        else
        local code = tonumber(code)
        end
        if code >= level then
        print("> Access Granted")
        disk.eject(sideIn)
        rs.setOutput(sideOut,true)
        sleep(rsTime)
        rs.setOutput(sideOut,false)
        else
        print("> Permission Denied")
        disk.eject(sideIn)
        end
    end
end

Когда диск не вставлен, выдается ошибка:

.temp:15: attempt to compare string with number expected, got string

Кто-нибудь знает, как решить эту проблему? Я бросил в ноль шашки, но, кажется, не работает. Любые идеи о том, как я мог это исправить? Я пытаюсь, по крайней мере, полчаса, и до сих пор понятия не имею.

1 ответ

В этой секции:

    local code = fs.open("disk/passcode.lua", "r").readAll() --(1)
    if code == nil then
    local code = 0 --(2)
    else
    local code = tonumber(code) --(3)
    end

Сначала создается новая локальная переменная с local code = ..., В новом блоке, который вы создаете с помощью ifВы также создаете новые локальные переменные с local code = ..., Поскольку он имеет то же имя, что и локальный до него, он "маскирует" его, запрещая вам доступ к первому code в остальной части блока. Значение, которое вы назначаете 0, не является той же переменной вне ifитак первый code не влияет. В else блок для второго code заканчивается, и то же самое происходит между else а также end когда условие ложно. Чтобы не назначать значения 0 или же tonumber(code) к новым переменным, вы должны удалить local от local code = ..., Итак, вот что должно быть:

local level = 3 -- Required access level
local sideIn = "bottom" -- Keycard Input Side
local sideOut = "right" -- Redstone output side
local rsTime = 3 -- Redstone time
while true do
    if disk.isPresent(sideIn) then
        term.clear()
        term.setCursorPos(1,1)
        local code = fs.open("disk/passcode.lua", "r").readAll()
        if code == nil then
            code = 0
        else
            code = tonumber(code)
        end
        if code >= level then
            print("> Access Granted")
            disk.eject(sideIn)
            rs.setOutput(sideOut,true)
            sleep(rsTime)
            rs.setOutput(sideOut,false)
        else
            print("> Permission Denied")
            disk.eject(sideIn)
        end
    end
end
Другие вопросы по тегам