Я обнаружил странное поведение, когда 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
актерского метода 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)