Lua 中的未定义标签

下面的代码中有一个无法定义的标签 room3。我该如何修复这个错误?

function room1 ()
    local move = io.read()
    if move == "south" then goto room3
    elseif move == "east" then return room2()
    else
        print("无效移动")
        return room1()   -- 保留在同一房间
    end
end

function room2 ()
    local move = io.read()
    if move == "south" then return room4()
    elseif move == "west" then return room1()
    else
        print("无效移动")
        return room2()
    end
end

::room3::
do
    local move = io.read()
    if move == "north" then return room1()
    elseif move == "east" then return room4()
    else
        print("无效移动")
        goto room3
    end
end

function room4 ()
    print("恭喜获胜!")
end

-- 我们通过调用初始房间来开始游戏:

room1()

另一方面,这段代码完美地工作:

goto room1

::room1:: do
    local move = io.read()
    if move == "south" then goto room3
    elseif move == "east" then return room2()
    else
        print("无效移动")
        goto room1
    end
end

::room2:: do
    local move = io.read()
    if move == "south" then goto room4
    elseif move == "west" then goto room1
    else
        print("无效移动")
        return room2()
    end
end

::room3:: do
    local move = io.read()
    if move == "north" then goto room1
    elseif move == "east" then goto room4
    else
        print("无效移动")
        goto room3
    end
end

::room4:: do
    print "恭喜获胜!"
end
点赞
用户2858170
用户2858170

room3room1() 的作用域中不可见。

来自 Lua 参考手册:

标记在定义的整个区块中可见,除了同名标记在嵌套的区块中定义的情况,以及在 嵌套函数 中定义的情况。使用 goto 时,只能跳转到可见标记,前提是它不会进入本地变量的作用域。

因此,你不能使用 goto 进入或退出函数。你不能跳入函数,因为标记位于函数内部,因此在外部不可见。你也不能从函数内部跳出函数,因为你无法从函数内部看到外部的标记。

我宁愿使用递归函数调用。我认为为什么你应该将 room3 与其他房间实现不同。

function room3()

    local move = io.read()
    if move == "north" then return room1()
    elseif move == "east" then return room4()
    else
        print("invalid move")
        return room3()
    end
end

请注意,在你进入 room1 的东边时,你的可用示例将导致错误,因为 function room2 未定义。

2016-03-22 10:23:01