println против System.out.println в Scala - PullRequest
45 голосов
/ 28 августа 2011

Я всегда думал, что Predef.println был просто ярлыком для System.out.println, но, по-видимому, я ошибаюсь, поскольку он, похоже, вообще не использует System.out. Почему это так? И как я могу сделать «перенаправление» System.out ниже в 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
"

1 Ответ

39 голосов
/ 28 августа 2011

Predef.println - это сокращение для Console.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
...