如何在匹配类型列表中使用模式匹配结果?

芬克尔森

我在Akka发现了一些奇怪的行为。匹配模式时,无法向列表添加消息:

  var msgs: List[Message] = Message() :: Nil

  ...

  override def receive: Receive = {
    case msg @ Message  => { 
      msgs = msgs.::(Message())   // ok
      //msgs = msgs.::(msg)       // doesn't work
      sender ! "Thanks!" 
    }
    case Request => { sender ! msgs.head }
    case _       =>
  }

这是一个错误ScalaAkka

要修复它,我需要区分大小写

msgs = msgs.::(msg.asInstanceOf[Message])

这不是一个方便的解决方案。

暗影之地

问题是您在case语句中发生的匹配中犯了一个细微的错误。您在此处与Message伴随对象而不是Message案例类进行匹配

看它的另一种方式是,case x @ Y语法可以被认为是说:“比赛与类型的任何实例Y,然后运行等同的val x: Y = <incoming value>.asInstanceOf[Y]”,但在这里,您提供的推断类型是一个无参数的类型,称为Message,其中,编译器必须是object Message,不是case class Message()

因此,要修复此行,请写入参数列表。例如,如果Message该类定义为:

case class Message()

这将会:

case msg @ Message() => ...

如果相反,我们说:

case class Message(text: String, id: Int)

然后,case语句变为:

case msg @ Message(txt, is) => ... 

或者,如果我们不在乎(或需要使用)textid参数:

case msg @ Message(_, _) => ... 

对于此处发生的情况,从技术上来说,它的稍微有点技术上正确的描述,case语句实际上是尝试与伴随对象(也称为“提取程序”)中可用的任何“未应用”方法进行匹配。默认情况下,对于任何与case类构造函数中提供的参数列表完全匹配的case类,在伴随对象中将免费提供anapplyunapply方法。在上述Message的第二个版本中,相关unapply方法将具有如下签名:

def unapply(text: String, id: Int): Option[Message]

您可以在此处此处阅读有关提取器的更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在R中使用模式匹配的结果

来自分类Dev

如何在F#中使用类型测试模式匹配异常?

来自分类Dev

如何模式匹配scala列表的头尾类型?

来自分类Dev

Scala如何在非通用LazyList中使用模式匹配?

来自分类Dev

如何在行组中使用 awk 进行模式匹配

来自分类Dev

与列表类型匹配的FSharp模式

来自分类Dev

与列表类型匹配的FSharp模式

来自分类Dev

如何对列表中的元素使用模式匹配?

来自分类Dev

如何反转模式的匹配结果?

来自分类Dev

如何在集合上使用模式匹配

来自分类Dev

如何在函数内部使用模式匹配?

来自分类Dev

在模式匹配F#中使用类型测试内联解构

来自分类Dev

Scala:在模式匹配中使用超类型运算符

来自分类Dev

在类型标签模式匹配中使用匿名变量匹配节点类型

来自分类Dev

如何在Haskell中触发类型族模式匹配错误?

来自分类Dev

如何在Scala中取消模式匹配中的类型?

来自分类Dev

如何在Scala中对多个类型进行模式匹配?

来自分类Dev

如何在PostgreSQL中使用正则表达式删除字段匹配模式的结尾?

来自分类Dev

如何在模式匹配功能中使用三角运算符

来自分类Dev

如何在R中使用正则表达式应用a和not b模式匹配

来自分类Dev

如何在模式匹配功能中使用三角运算符

来自分类Dev

如何在 Spark2 Scala 中使用大小写匹配模式

来自分类Dev

Mockito-如何使用列表匹配器限制列表类型?

来自分类Dev

如何在SQLite中使用字符列表匹配字符串

来自分类Dev

如何在Lambda函数中使用python搜索Json输出中的匹配列表?

来自分类Dev

如何在SQLite中使用字符列表匹配字符串

来自分类Dev

模式匹配如何与列表一起使用

来自分类Dev

如何使用模式匹配在scala中获取nonEmpty列表?

来自分类Dev

如何使用groovy / Gradle DSL获取与模式匹配的目录列表?

Related 相关文章

  1. 1

    如何在R中使用模式匹配的结果

  2. 2

    如何在F#中使用类型测试模式匹配异常?

  3. 3

    如何模式匹配scala列表的头尾类型?

  4. 4

    Scala如何在非通用LazyList中使用模式匹配?

  5. 5

    如何在行组中使用 awk 进行模式匹配

  6. 6

    与列表类型匹配的FSharp模式

  7. 7

    与列表类型匹配的FSharp模式

  8. 8

    如何对列表中的元素使用模式匹配?

  9. 9

    如何反转模式的匹配结果?

  10. 10

    如何在集合上使用模式匹配

  11. 11

    如何在函数内部使用模式匹配?

  12. 12

    在模式匹配F#中使用类型测试内联解构

  13. 13

    Scala:在模式匹配中使用超类型运算符

  14. 14

    在类型标签模式匹配中使用匿名变量匹配节点类型

  15. 15

    如何在Haskell中触发类型族模式匹配错误?

  16. 16

    如何在Scala中取消模式匹配中的类型?

  17. 17

    如何在Scala中对多个类型进行模式匹配?

  18. 18

    如何在PostgreSQL中使用正则表达式删除字段匹配模式的结尾?

  19. 19

    如何在模式匹配功能中使用三角运算符

  20. 20

    如何在R中使用正则表达式应用a和not b模式匹配

  21. 21

    如何在模式匹配功能中使用三角运算符

  22. 22

    如何在 Spark2 Scala 中使用大小写匹配模式

  23. 23

    Mockito-如何使用列表匹配器限制列表类型?

  24. 24

    如何在SQLite中使用字符列表匹配字符串

  25. 25

    如何在Lambda函数中使用python搜索Json输出中的匹配列表?

  26. 26

    如何在SQLite中使用字符列表匹配字符串

  27. 27

    模式匹配如何与列表一起使用

  28. 28

    如何使用模式匹配在scala中获取nonEmpty列表?

  29. 29

    如何使用groovy / Gradle DSL获取与模式匹配的目录列表?

热门标签

归档