Lua中的if语句在使用io.read时无法正常工作。

我正在尝试制作一个“简单”的是/否答案选择的东西。 (你经常在旧程序上看到)但是我正在使用的 If 语句似乎不想工作。 我甚至打印出变量,它与我想要比较的内容完全不同,但它仍然通过了。

        --程序功能

        function check()

        --局部变量
            local num = 0
            local loop = true
            io.write("继续吗?(Y/N):")
            --用户输入
            local input = io.read()

            while(loop==true) do

                if (input=="y" or "Y") then

                    print("好的!")
                    loop = true
                    num = 1

                elseif (input=="n" or "N") then

                    print("好的...")
                    num = 2

                else

                    print("无效的答案!")
                    loop = true
                    num = 0

                end
            end
            print(input)
            return(num)
        end

        print (check())
点赞
用户2303714
用户2303714

我会这样写你的函数:

function check()
    io.write("继续吗?(Y/N): ")
    answer = io.read()
    while( not (answer == "Y" or answer == "N") ) do
        io.write("无效答案!请重新输入(Y/N): ")
        answer = io.read()
    end
    if answer == "Y" then
        print("好的!")
        return 1
    else
        print("好吧......")
        return 2
    end
end

print(check())

以下是一些使用案例:

继续吗?(Y/N): Huh?
无效答案!请重新输入(Y/N): N
好吧......
2
>退出代码:0
>lua -e "io.stdout:setvbuf 'no'" "a.lua"
继续吗?(Y/N): Huh?
无效答案!请重新输入(Y/N): Y
好的!
1

一个能工作的版本应该是这样的:

function check()
    local num = 0
    local loop = true
    io.write("继续吗?(Y/N): ")

    while(loop==true) do
        --用户输入
        local input = io.read()
        if (input == "y" or  input == "Y") then
            print("好的!")
            num = 1
            loop = false --如果输入有效,我们想要停止循环
        elseif (input == "n" or input == "N") then
            print("好吧......")
            num = 2
            loop = false --如果输入有效,我们想要停止循环
        else
            print("无效答案!")
            -- 不需要再将循环设为true
            num = 0
        end
    end
    return(num)
end

修改的内容:

  1. 在while循环内部获取用户输入,这样如果输入无效并进入下一次循环时,获取输入的逻辑将会复用,我们不必编写两种获取输入的情况;一种在循环之外,另一种在循环内部。它还会在循环重新开始时“暂停”执行,这就是产生所有输出的原因!
  2. input == "y" or "Y"并不是你认为的那样。它实际上相当于(input == "y") or ("Y"),你需要的是input == "y" or input == "Y"
  3. 当输入是"y" or "Y""n" or "N"时,你需要将循环设置为false,否则循环将继续。
  4. 因此,将循环设置为true并不必要,因为它一开始就是true,而你能做的唯一更改就是将其设置为false。由于每个条件都是互斥的,即输入是"y"或"Y"相互排斥于输入是"n"或"N"或它既不是"y"或"Y"也不是"n"或"N"。你不需要担心它被设置为false,除非你想要结束循环。
2013-05-18 07:39:04
用户1847592
用户1847592
本地函数 `check()`:

```lua
local function check()
   io.write"Continue? (Y/N): " -- 输出提示信息
   local ans, num = {y = 1, n = 2} -- 存储输入 'Y' 和 'N' 的对应数值
   repeat
      num = ans[io.read():lower()] or 3 -- 获取用户输入并转换为小写,如果是 'Y' 或 'N',则将其对应的数值赋给 num,否则 num 为 3
      io.write(({"Ok!\n","Fine...\n","Invalid Answer! Try again (Y/N): "})[num]) -- 根据 num 的值输出不同的提示信息
   until num < 3 -- 如果 num 小于 3,跳出循环
   return num -- 返回 num 的值
end

print (check()) -- 调用 `check()` 函数并输出其返回值
2013-05-18 08:09:30