web-dev-qa-db-ja.com

println vs System.out.println in Scala

Predef.printlnSystem.out.printlnの単なるショートカットであるといつも思っていましたが、System.outをまったく使用していないように見えるため、間違いだと思われます。どうしてこんなことに?また、Scalaで以下のSystem.outの「リダイレクト」を行うにはどうすればよいですか?

scala> val baos = new Java.io.ByteArrayOutputStream
baos: Java.io.ByteArrayOutputStream = 

scala> val ps = new Java.io.PrintStream(baos)
ps: Java.io.PrintStream = Java.io.PrintStream@6c5ac4

scala> System.setOut(ps)

scala> println("hello")
hello

scala> new String(baos.toByteArray)
res2: Java.lang.String = ""

scala> System.out.println("hello")

scala> new String(baos.toByteArray)
res7: Java.lang.String = 
"hello
"
45
Kim Stebel

Predef.printlnConsole.printlnのショートカットであり、Console.setOutまたはConsole.withOutをリダイレクトに使用できます。

また、Console.setOutは現在のスレッドにのみ影響し、System.setOutはJVM全体に影響します。さらにScala 2.9 replは独自のスレッドの各行を評価するため、Console.setOutはそこで使用できません。

scala> val baos = new Java.io.ByteArrayOutputStream
baos: Java.io.ByteArrayOutputStream = 

scala> Console.withOut(baos)(print("hello"))

scala> println(baos)
hello
39
4e6