如何从标准input逐行读取?

从标准input中逐行读取Scala的配方是什么? 像相当于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()); } } } 

最直接的方法是使用Predef一部分readLine() 。 然而这是相当丑陋的,因为你需要检查最终的空值:

 object ScannerTest { def main(args: Array[String]) { var ok = true while (ok) { val ln = readLine() ok = ln != null if (ok) println(ln) } } } 

这是非常详细的,你宁愿使用java.util.Scanner来代替。

我认为更漂亮的方法将使用scala.io.Source

 object ScannerTest { def main(args: Array[String]) { for (ln <- io.Source.stdin.getLines) println(ln) } } 

对于控制台,您可以使用Console.readLine 。 你可以写(如果你想停在一个空行):

 Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line)) 

如果你捕捉一个文件来产生input,你可能需要使用下面的命令停止null或empty:

 @inline def defined(line: String) = { line != null && line.nonEmpty } Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line)) 
 val input = Source.fromInputStream(System.in); val lines = input.getLines.collect 

你不能用吗?

 var userinput = readInt // for integers var userinput = readLine ... 

如下所示 : Scaladoc API

recursion版本(编译器检测到尾recursion以提高堆使用率),

 def read: Unit = { val s = scala.io.StdIn.readLine() println(s) if (s.isEmpty) () else read } 

请注意使用Scala 2.11中的io.StdIn 。 另外请注意,使用这种方法,我们可以将用户input累积到最终返回的集合中,并将其打印出来。 也就是说,

 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]()) }