2011-08-28 22 views
39

Siempre pensé que Predef.println era simplemente un atajo para System.out.println, pero aparentemente estoy equivocado, ya que no parece usar System.out en absoluto. ¿Por qué es así? ¿Y cómo puedo hacer el "redireccionamiento" de System.out a continuación en Scala?println vs System.out.println en Scala

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

scala> val ps = new java.io.PrintStream(baos) 
ps: java.io.PrintStream = [email protected] 

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 
" 
+2

Ver https://issues.scala-lang.org/browse/SI-4793. – huynhjl

Respuesta

34

Predef.println es atajo para Console.println y se puede utilizar Console.setOut o Console.withOut para redireccionar.

Además, Console.setOut solo afecta al hilo actual, mientras que System.setOut afecta a toda la JVM. Además, Scala 2.9 repl evalúa cada línea en su propio hilo, por lo que Console.setOut no se puede usar allí.

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

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

scala> println(baos) 
hello 
+10

'sin' suena de alguna manera incorrecto, incluso el gran O no lo cura. :) –

+0

@userunknown De acuerdo. Para empeorar las cosas, incluso hay una 'Console.withIn'. –