Подтвердить что ты не робот

Println vs System.out.println в Scala

Я всегда думал, что 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 = [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
"
4b9b3361

Ответ 1

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