Scala Actors + Console.withOut可能的错误

时间:2011-02-15 08:42:30

标签: scala actor io-redirection

我在演员中使用Console.withOut时发现了一些奇怪的行为。代码:

case object I
val out = new PipedOutputStream
val pipe = new PipedInputStream(out)
def read: String = ** read from `pipe` stream
class A extends Actor{
  var b: Actor = _
  Console.withOut(out){
    b = actor { loop { self react {
          case I => println("II")
        }}}
    }
  def act = {
    loop { self react {
        case I =>
          println("I")
          b ! I
      }}
    }
  }
def main(args: Array[String]): Unit = {
  val a = new A
  a.start
  a ! I
  Thread sleep 100
  println("!!\n" + read + "!!")
  }

得到以下输出:

!!
I
II
!!

知道为什么A actor act方法的输出也被重定向?谢谢你的回答。

更新 这是读函数:

  @tailrec
  def read(instream: InputStream, acc: List[Char] = Nil): String =
    if(instream.available > 0) read(instream, acc :+ instream.read.toChar) else acc mkString ""
  def read: String = read(pipe)

1 个答案:

答案 0 :(得分:3)

相反,在我看来,两个actor都没有重定向其输出,因为withOut将在调用println("II")之前很久就完成执行。因为这完全基于DynamicVariable,所以我不愿意赌它。 :-)缺乏工作代码也排除了任何测试。