first `readLine` пропускается в потоке управления` case-of` в Nim-lang - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующий код.

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. Но составленные readLine команды из процедуры prompt появляются одна за другой для получения пользовательского ввода.

Мне было интересно, что мне не хватает, чтобы понять здесь. Может ли кто-нибудь просветить меня?

Код для 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

1 Ответ

1 голос
/ 14 апреля 2020

Вы делаете readChar, чтобы получить значение opt, а затем вводите два символа: n и \n. Первое значение opt, второе получает в буфере или сохраняется в 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 и отражается.

У вас есть два варианта решения проблемы:

  1. Считайте строку вместо символа и сохраните только первый символ с чем-то вроде var opt = readLine(stdin)[0].

  2. Используйте rdstdin модуль:

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