Lua中未定义的标签

时间:2016-03-22 04:01:04

标签: lua

以下代码具有未定义的标签room3。我怎么能解决这个错误?

function room1 ()
    local move = io.read()
    if move == "south" then goto room3
    elseif move == "east" then return room2()
    else
        print("invalid move")
        return room1()   -- stay in the same room
    end
end

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

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

function room4 ()
    print("congratulations!")
end

-- We start the game with a call to the initial room:

room1()

另一方面,这段代码完美无缺:

goto room1

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

::room2:: do
    local move = io.read()
    if move == "south" then goto room4
    elseif move == "wast" then goto room1
    else
        print("invalid move")
        return room2()
    end
end

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

::room4:: do
    print "Congratulations, you won!"
end

1 个答案:

答案 0 :(得分:2)

room1()的范围内无法看到

goto

来自Lua参考:

  

在定义它的整个块中可以看到标签除了   嵌套块内部定义了具有相同名称的标签   嵌套函数内部。 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向东行进时,您的工作示例会导致错误,因为def suma[T](args: WrappedArray[T]*)(implicit n: Numeric[T]) = { args.transpose.map(_.sum) } def sum[T](arr: WrappedArray[WrappedArray[T]])(implicit n: Numeric[T]) = { val result = suma( ______ ) } 未定义。