2011-08-28 18 views
39

私はいつもPredef.printlnSystem.out.printlnのショートカットにすぎないと思っていましたが、明らかに私は間違っています。System.outを使用していないようです。どうしてこんなことに?そして、スカラの下でSystem.outの "リダイレクト"をどうすればできますか?println対ScalaのSystem.out.println

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

https://issues.scala-lang.org/browse/SI-4793を参照してください。 – huynhjl

答えて

34

Predef.printlnConsole.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 
+10

'なにも間違っている音はありません、大きなOもそれを癒すわけではありません。 :) –

+0

@userunknown同意。事態をさらに悪化させるために、 'Console.withIn'もあります。 –

関連する問題