web-dev-qa-db-fra.com

println vs System.out.println dans Scala

J'ai toujours pensé que Predef.println n'était qu'un raccourci pour System.out.println, mais apparemment je me trompe, car il ne semble pas utiliser System.out du tout. Pourquoi est-ce si? Et comment puis-je faire la "redirection" de System.out ci-dessous à Scala?

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.println est un raccourci pour Console.println et vous pouvez utiliser Console.setOut ou Console.withOut pour la redirection.

Aussi, Console.setOut affecte uniquement le thread actuel tandis que System.setOut affecte l'ensemble de la JVM. De plus Scala 2.9 repl évalue chaque ligne dans son propre thread, donc Console.setOut n'est pas utilisable ici.

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

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

scala> println(baos)
hello
39
4e6