Scala演员示例:预期类型是:?

Ava*_*tiC 1 scala actor

在一些教程的指导下,我一直试图让一个简单的Scala Actor示例工作,我将一个(String-)消息发送给一个actor,该actor回复一个输出到控制台.我的代码是:

import scala.io.Source
import scala.actors.Actor

object ProtTest {

  class testActor extends Actor {
    def receive = { 
      case "you" => Console.println("Hello you!")
      case _ => Console.println ("Hello ???")
    }
  }

  val t = new testActor
  t ! "you"
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我在"def receive = {"上收到以下错误消息,并且已经停留了很长一段时间了:

Missing parameter type for expanded function 
The argument types of an anonymous function must be fully known (SLS 8.5)
Expected Type was: ?
Run Code Online (Sandbox Code Playgroud)

我真的不知道错误消息中的问号是什么意思以及如何修复示例以便它可以工作?!

Dan*_*mon 5

看起来你对actor的实现有点困惑.您的testActor代码对Akka actor 有效,但您使用的是Scala actors库.

Akka和scala.actors是actor模型的两个不同实现.Scala actor是最初的实现,但Akka现在更受欢迎(并且远远优于IMO),而Scala 2.10是与Scala捆绑的标准实现(scala.actors存在但在2.10中已弃用).

我实际上不知道如何正确实现一个scala actor,但这里是如何让你的演员在Akka中运行:

import akka.actor._

object ProtTest {

  class testActor extends Actor {
    def receive = { 
      case "you" => Console.println("Hello you!")
      case _ => Console.println ("Hello ???")
    }

    override def postStop() {
      context.system.shutdown
    }
  }

  val system = ActorSystem("test")
  val t = system.actorOf(Props[testActor])
  t ! "you"
  t ! PoisonPill
  system.awaitTermination

}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Akka需要一些样板来正确设置和关闭actor系统,但您的主要演员代码不变.在postStopactor关闭后调用该方法,这在actor接收PoisonPill消息时发生.