匹配Akka中的值类

时间:2017-02-17 12:06:09

标签: scala akka value-class

我创建了Value Class

final class Feature(val value: Vector[Double]) extends AnyVal

match中针对该类的scala

val d = new Feature(Vector(1.1))
s match {
  case a:Feature => println(s"a:feature, $a")
  case _ => println("_")
}

这项工作正常,但在Akka中,与上面相同的类,在receive方法中,这不起作用:

  def receive = LoggingReceive {
    case a:Feature =>
      log.info("Got Feature: {}", a)
    case _ => println("_")
  }

当我执行代码时,虽然我发送的是Feature,但正在执行的case语句是case _ => println("_"),但是,如果我将代码更改为:

  def receive = LoggingReceive {
    case a:Feature =>
      log.info("Got Feature: {}", a)
    case b:Vector[_] =>
      log.info("GOT FEATURE")
    case _ => println("_")
  }

case b:Vector[_]已执行。

Akka文档提到:

  

实例化actor道具的推荐方法是在运行时使用反射来确定正确的actor构造 -   当所述构造函数接受参数时,不支持由于技术限制而调用的tor   价值类。在这些情况下,您应该通过调用构造函数来解包参数或创建props   手动:

但是不要提及与Value classes

匹配的任何内容

更新

感谢YuvalItzchakov的帮助。演员的代码如下:

接收消息的Actor:

  def receive = LoggingReceive {
    case Feature(a) =>
      log.info("Got feature {}", a)
    // ....
  }

发送消息的Actor:

  def receive = LoggingReceive {
    // ..
    case json: JValue =>
      log.info("Getting json response, computing features...")
      val features = Feature(FeatureExtractor.getFeatures(json))
      log.debug(s"Features: $features")
      featureListener.get ! features
    // ..
  }

1 个答案:

答案 0 :(得分:2)

由于值类的工作方式,您的示例都会导致Feature的分配。一旦由于模式匹配示例中的运行时检查,另一个由于receive的签名而需要Any作为输入类型。

docs for Value Classes指定(强调我的):

  

分配摘要

     

在以下情况下实际实例化值类:

     
      
  • 将值类视为另一种类型
  •   
  • 将值类分配给数组。
  •   
  • 执行运行时类型测试,例如模式匹配
  •   

这意味着,如果您看到Vector[_]类型,则表示您实际从代码中的某个位置传递了具体向量。