Jaki jest przepis Scala na czytanie wiersz po wierszu ze standardowego wejścia? Coś w rodzaju równoważnego kodu java:
import java.util.Scanner;
public class ScannerTest {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
System.out.println(sc.nextLine());
}
}
}
java
scala
io
java.util.scanner
Andrei Ciobanu
źródło
źródło
scala.io.StdIn
Do konsoli możesz użyć
Console.readLine
. Możesz napisać (jeśli chcesz zatrzymać się w pustej linii):Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))
Jeśli utworzysz plik w celu wygenerowania danych wejściowych, może być konieczne zatrzymanie się na wartości null lub pustej za pomocą:
@inline def defined(line: String) = { line != null && line.nonEmpty } Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
źródło
takeWhile(_ != null)
Console.readLine
jest przestarzałe, użyjStdIn.readline
zamiast tego..takeWhile(Option(_).nonEmpty)
może poczuć się lepiej, jeśli chcesznull
całkowicie uniknąć słowa kluczowego.val input = Source.fromInputStream(System.in); val lines = input.getLines.collect
źródło
io.Source.stdin
jest zdefiniowany (wscala.io.Source
klasie),def stdin = fromInputStream(System.in)
więc prawdopodobnie lepiej jest trzymać sięio.Source.stdin
.collect
metoda została zmieniona, więc musisz po prostu wywołać,input.getLines
co daje ciIterator
. Możesz zmusić go do materializacji za pomocą.toStream
lub.toList
na nim, w zależności od przypadku użycia.Wersja rekurencyjna (kompilator wykrywa rekurencję ogona w celu lepszego wykorzystania sterty),
def read: Unit = { val s = scala.io.StdIn.readLine() println(s) if (s.isEmpty) () else read }
Zwróć uwagę na użycie
io.StdIn
z Scala 2.11. Zauważ również, że dzięki temu podejściu możemy gromadzić dane wejściowe użytkownika w kolekcji, która jest ostatecznie zwracana - oprócz tego, że zostanie wydrukowana. Mianowicie,import annotation.tailrec def read: Seq[String]= { @tailrec def reread(xs: Seq[String]): Seq[String] = { val s = StdIn.readLine() println(s) if (s.isEmpty()) xs else reread(s +: xs) } reread(Seq[String]()) }
źródło
Nie możesz użyć
var userinput = readInt // for integers var userinput = readLine ...
Dostępne tutaj: Scaladoc API
źródło
Jak wspomniano pokrótce w innych komentarzach,
scala.Predef.readLine()
jest przestarzały od wersji Scala 2.11.0 i można go zastąpićscala.io.StdIn.readLine()
:// Read STDIN lines until a blank one import scala.io.StdIn.readLine var line = "" do { line = readLine() println("Read: " + line) } while (line != "")
źródło