попытка сравнить строку с номером - компьютерный - PullRequest
0 голосов
/ 31 декабря 2018
    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 Ответ

0 голосов
/ 31 декабря 2018

В этом разделе:

    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
...