Вы можете использовать либо Iterate.continually
, чтобы повторять одно и то же снова и снова, пока не наложите какое-либо условие остановки (с помощью dropWhile
), либо вы можете использовать Iterator.iterate
, чтобы выдать вам предыдущую строку, если хотите используйте это в своем сообщении об ошибке:
val choiceType = Iterator.iterate(readLine())(line => {
println("Error input: "+line+". Please enter again (from 1-5).)")
readLine()
}).collect(line => line match {
case "1" => println("Not implemented"); line
case "2" => println("Not implemented"); line
case "3" => println("Not implemented"); line
case "4" => println("Not implemented"); line
case "5" => println("Thanks for using."); line
}).next.toInt
Способ, которым это работает, начинается с readLine, а затем, если ему нужна другая строка, он объявляет сообщение об ошибке, основанное на предыдущей строке (очевидно, что она была неправильной), и читает другую строку. Затем вы используете блок collect
, чтобы выбрать правильный ввод; неправильный ввод просто проваливается без сбора. В этом случае, так как вы хотите превратить его в целое число, я просто пропускаю строку. Теперь нам нужна только одна хорошая запись, поэтому мы получаем next
и конвертируем его в int.
Вы также можете использовать рекурсивную функцию, чтобы сделать похожую вещь:
def getChoice: String = {
val line = readLine()
line match {
case "1" => println("Not implemented"); line
case "2" => println("Not implemented"); line
case "3" => println("Not implemented"); line
case "4" => println("Not implemented"); line
case "5" => println("Thanks for using."); line
case _ => println("Error, blah blah."); getChoice
}
}
val choiceType = getChoice.toInt
Здесь дело в том, что в случае неправильного ввода вы просто снова вызываете функцию. Поскольку это последнее, что происходит в функции, Scala избегает истинного вызова функции и просто переходит к началу (хвостовая рекурсия), поэтому вы не переполните стек.