在Scala中,println和System.out.println有什么区别?

47
我一直以为Predef.println只是System.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
"

2
请参见 https://issues.scala-lang.org/browse/SI-4793。 - huynhjl
1个回答

43

Predef.printlnConsole.println的快捷方式,你可以使用Console.setOutConsole.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

14
“without” 这个词听起来有些不对劲,即使是大写字母 O 也无法让它变得正确。 :) - user unknown
1
@userunknown 同意。更糟糕的是,甚至还有一个 Console.withIn - DagdA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接