第一个 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
的第一个分支,test
(stdin
的其余部分)分配给 ss
,并回显。
您有两种选择来解决问题:
读取一行而不是一个字符,并仅存储第一个字符,如 var opt = readLine(stdin)[0]
.
使用rdstdin模块:
import rdstdin
var ss = readLineFromStdin("Salu:")
我有以下代码。
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
的第一个分支,test
(stdin
的其余部分)分配给 ss
,并回显。
您有两种选择来解决问题:
读取一行而不是一个字符,并仅存储第一个字符,如
var opt = readLine(stdin)[0]
.使用rdstdin模块:
import rdstdin var ss = readLineFromStdin("Salu:")