Scala Actors + Console.withOut возможная ошибка - PullRequest
0 голосов
/ 15 февраля 2011

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

1 Ответ

3 голосов
/ 15 февраля 2011

Наоборот, мне кажется, что ни у одного из актеров не перенаправлен вывод, поскольку withOut завершит выполнение задолго до вызова println("II").Поскольку все это основано на DynamicVariable, я не готов на это ставить.:-) Отсутствие рабочего кода также исключает любое тестирование.

...