第一个 readLine 在 Nim-lang 中的 case-of 控制流中被跳过

first `readLine` is skipped inside a `case - of` control flow in Nim-lang

我有以下代码。

import lib

var stat = false

when isMainModule:
  while stat != true:
    echo("Option: ")
    var opt = readChar(stdin)
    case opt
      of 'q':
        stat = true
      of 'n':
        echo("Salu: ")
        var ss = readLine(stdin)
        echo("Nam: ")
        var nn = readLine(stdin)
        let k = prompt("Rust")
      else: discard

我想要实现的是,针对两个变量依次提示和接收用户输入。选择 n 后,我首先期望 Salu,一旦提供了用户输入,然后 Nam

但是,当我通过发出以下命令执行以下 nim 代码时收到的是 nim c -r src/mycode.nim

~~> nim c -r src/cmdparsing.nim
...
...
...
CC: stdlib_system.nim
CC: cmdparsing.nim
Hint:  [Link]
Hint: operation successful (48441 lines compiled; 2.338 sec total; 66.824MiB peakmem; Debug Build) [SuccessX]
Hint: /home/XXXXX/Development/nim_devel/mycode/src/mycode  [Exec]
Option: 
n
Salu: 
Nam:

Salu 正在回显,但 readLine 不等待我的输入并立即回显 Nam。但是,来自 prompt 过程的堆叠 readLine 命令一个接一个地出现以接收用户输入。

我想知道我在这里想了解的是什么。谁能赐教一下?

prompt 的代码位于 lib.nim 中,如下所示,

proc prompt*(name: string): bool =
  echo("Salutation: ")
  var nn = readLine(stdin)
  echo(nn&"."&name)
  echo("Diesel")
  var dd = readLine(stdin)
  echo(dd)
  return true

您执行 readChar 以获得 opt 值,然后输入两个字符:n\n。第一个是 opt 值,第二个得到 buffered 或保留在 stdin 等待进一步阅读。下次您尝试读取一行时,仍然挂起的 \n 将被解释为一个新行,并立即分配给 ss。您看不到任何内容,因为除了换行符之外该行是空的。

例如

var opt = readChar(stdin)

case opt
of 'n':
  var ss = readLine(stdin)
  echo ss
else:
  discard

编译和运行,但在输入中写类似"ntest"的内容。 n 触发 case 的第一个分支,teststdin 的其余部分)分配给 ss,并回显。

您有两种选择来解决问题:

  1. 读取一行而不是一个字符,并仅存储第一个字符,如 var opt = readLine(stdin)[0].

  2. 使用rdstdin模块:

    import rdstdin
    
    var ss = readLineFromStdin("Salu:")