Scala標準入力から1行ずつ読み込むためのレシピ?同等の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))
入力を生成するためにファイルをcatする場合、次を使用してnullまたは空で停止する必要があります。
@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
再帰バージョン(コンパイラーは、ヒープ使用量を改善するために末尾再帰を検出します)
def read: Unit = {
val s = scala.io.StdIn.readLine()
println(s)
if (s.isEmpty) () else read
}
Scala 2.11からのio.StdIn
の使用に注意してください。このアプローチでは、出力に加えて、最終的に返されるコレクションにユーザー入力を蓄積できることに注意してください。
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]())
}