Scala:向Actors发送/处理类型消息

时间:2012-06-10 17:48:54

标签: scala

我正在尝试创建一个具有Option管道的Scala Actor。我希望能够向此actor发送Option消息,然后继续调用选项管道并对结果执行某些操作。如果这样的事情已经存在,你知道我在哪里找到它吗?

请在下面找到我的代码以及我得到的奇怪的编译错误:

“SBT构建器在编译项目时崩溃。这是Scala编译器或SBT中的错误。请查看Erorr日志以获取详细信息。错误消息为:null”

MonadChainActor.scala

import scala.actors.Actor

class MonadChainActor[T](monadChain: Option[T]=>Option[T]) extends Actor {

  case class OptionMessage(o:Option[T])

  def act() {
    while(true){
      receive {
        case OptionMessage(o) => println(monadChain(o).get)
      }
    }
  }

}

Main.scala

def monadIntChain(a:Option[Int]):Option[Int] = 
  a.map(x => x+1).map(x => x+1).map(x => x+1)

object Main {
  def main(args: Array[String]): Unit = {
    var a = new MonadChainActor(monadIntChain)
    a ! a.OptionMessage(Some(1))  
  }
}

1 个答案:

答案 0 :(得分:1)

看起来您在scala编译器中发现了一个错误。我注意到如果你不使用路径依赖类型OptionMessage,它可以工作(我还添加了Stop消息):

import scala.actors.Actor

class MonadChainActor[T](monadChain: Option[T]=>Option[T]) extends Actor {
  case object Stop
  def act() {
    while (true) {
      receive {
        case o: Option[T] => println(monadChain(o).get)
        case Stop => exit()
      }
    }
  }
}

object Main {
  def monadIntChain(a:Option[Int]):Option[Int] = 
    a.map(x => x+1).map(x => x+1).map(x => x+1)
  def main(args: Array[String]): Unit = {
    var a = new MonadChainActor(monadIntChain)
    a.start
    a ! Some(3)  
    a ! a.Stop
  }
}

或者你可以在演员之外声明它(我在外面声明Stop只是为了保持一致):

import scala.actors.Actor

case class OptionMessage[T](o:Option[T])
case object Stop

class MonadChainActor[T](monadChain: Option[T]=>Option[T]) extends Actor {
  def act() {
    while (true) {
      receive {
        case om : OptionMessage[T] => println(monadChain(om.o).get)
        case Stop => exit()
      }
    }
  }
}

object Main {
  def monadIntChain(a:Option[Int]):Option[Int] = 
    a.map(x => x+1).map(x => x+1).map(x => x+1)
  def main(args: Array[String]): Unit = {
    var a = new MonadChainActor(monadIntChain)
    a.start
    a ! OptionMessage(Some(3))  
    a ! Stop
  }
}