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