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
有人知道如何解决此问题吗?我扔了一个nil检查器,但它似乎不起作用。关于如何解决此问题的任何想法?我已经尝试了至少半个小时,但我仍然一无所知。
答案 0 :(得分: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
的块结束,并且当条件为false时,在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