Apa resep Scala untuk membaca baris demi baris dari input standar? Sesuatu seperti kode java yang setara:
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
sumber
sumber
scala.io.StdIn
Untuk konsol, Anda dapat menggunakan
Console.readLine
. Anda dapat menulis (jika Anda ingin berhenti di baris kosong):Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))
Jika Anda membuat file untuk menghasilkan input, Anda mungkin perlu berhenti pada null atau kosong menggunakan:
@inline def defined(line: String) = { line != null && line.nonEmpty } Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
sumber
takeWhile(_ != null)
Console.readLine
tidak digunakan lagi, gunakanStdIn.readline
saja..takeWhile(Option(_).nonEmpty)
mungkin merasa lebih baik jika Anda ingin menghindarinull
kata kunci sepenuhnya.val input = Source.fromInputStream(System.in); val lines = input.getLines.collect
sumber
io.Source.stdin
didefinisikan (discala.io.Source
kelas)def stdin = fromInputStream(System.in)
jadi mungkin lebih baik untuk tetap menggunakanio.Source.stdin
.collect
metodenya diubah sejak jawaban ini sehingga Anda hanya perlu memanggilinput.getLines
yang memberi AndaIterator
. Anda dapat memaksanya untuk terwujud menggunakan.toStream
atau.toList
di atasnya, tergantung pada kasus penggunaan.Versi rekursif (kompilator mendeteksi rekursi ekor untuk peningkatan penggunaan heap),
def read: Unit = { val s = scala.io.StdIn.readLine() println(s) if (s.isEmpty) () else read }
Perhatikan penggunaan
io.StdIn
dari Scala 2.11. Perhatikan juga dengan pendekatan ini, kita dapat mengakumulasikan input pengguna dalam koleksi yang akhirnya dikembalikan - selain untuk dicetak. Yaitu,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]()) }
sumber
Bisakah kamu tidak menggunakan
var userinput = readInt // for integers var userinput = readLine ...
Seperti yang tersedia di sini: API Scaladoc
sumber
Seperti disebutkan secara singkat di komentar lain,
scala.Predef.readLine()
tidak digunakan lagi sejak Scala 2.11.0, dan Anda dapat menggantinya denganscala.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 != "")
sumber