Scala匹配表达式中的构造函数模式和变量绑定模式有什么区别?

可选的

在Scala中,我试图理解模式匹配,但是大多数模式都是自我解释的,但构造函数模式和变量绑定模式对我来说却令人困惑。我尝试了来自Programming Scala,2ed的以下示例

case class Address(street: String, city: String, country: String)
case class Person(name: String, age: Int, address: Address) 

object ScalaCaseDemoMain extends App{

    val alice   = Person("Alice",   25, Address("1 Scala Lane", "Chicago", "USA"))
    val bob     = Person("Bob",     29, Address("2 Java Ave.",  "Miami",   "USA"))
    val charlie = Person("Charlie", 32, Address("3 Python Ct.", "Boston",  "USA"))

    for (person <- Seq(alice, bob, charlie)) {
    person match {
        case p @ Person("Alice", 25, address) => println(s"Hi Alice! $p")
        case p @ Person("Bob", 29, a @ Address(street, city, country)) =>
        println(s"Hi ${p.name}! age ${p.age}, in ${a.city}")
        case p @ Person(name, age, _) =>
      println(s"Who are you, $age year-old person named $name? $p")
  }
}

    }

我想知道何时使用构造函数模式

case Person("Alice", 25, address) => //some action here

以及何时使用变量绑定模式

case p @ Person("Alice", 25, address) //some action here

在模式匹配方面,我总是很困惑。

安德烈亚斯·纽曼(Andreas Neumann)

构造函数与提取器

在大多数情况下,您称为构造函数的模式称为ExtractorDeconstructor正如它通过调用的方法可以看到的那样,它就像一个反向的构造函数unapply

如果它出现在右侧或外侧,pattern match则就像您指出的Constructor

回答

@仅用于pattern matching将解构的实体绑定到变量。目的是提供捕获整个表达式的选项,并且仍然能够在以后的步骤中使用提取的值。

因此,总会有一种不需要使用的方式来排列代码,@但它可以大大提高可读性。

例子

的使用示例@是:您想向所有名称早于“ 21”的名为“爱丽丝”的人发送邮件,但该地址不是重要的选择标准

case p @ Person("Alice", age, _) if age > 21 => storePersonForMailing(p)

在这里,模式匹配通过强调用于选择的值来清楚地表明您的意图,并且由于以后需要发送邮件的地址时,丢弃它不是一个好主意。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala匹配表达式中的构造函数模式和变量绑定模式有什么区别?

来自分类Dev

C ++中的原型设计模式和复制构造函数有什么区别

来自分类Dev

Scala中的表达式和语句有什么区别

来自分类Dev

构造函数模式和原型模式之间的区别

来自分类Dev

Scala:Scala中的模式匹配和匹配表达式是否相同?

来自分类Dev

使用函数和使用内联表达式设置作用域变量之间有什么区别

来自分类Dev

如何在scala中的foreach函数中的正则表达式上进行模式匹配?

来自分类Dev

模式匹配 Scala 中的正则表达式数组

来自分类Dev

正则表达式[-+]有什么区别?和(-| +)?

来自分类Dev

将函数的引用和 lambda 表达式作为参数传递时有什么区别?

来自分类Dev

在模式匹配中结合变量和正则表达式

来自分类Dev

[\ s \ S] *之间有什么区别?和 。*?在Java正则表达式中?

来自分类Dev

Django URL的正则表达式中的r''和r'^ $'有什么区别?

来自分类Dev

bash的条件表达式中-a和-e有什么区别?

来自分类Dev

(。*?)和(。*)有什么区别?在正则表达式中?

来自分类Dev

正则表达式和javascript中的字符串有什么区别?

来自分类Dev

正则表达式中<p>(。+?)<\ / p>和(?<= <p>)(。+?)(?= <\ / p>)之间有什么区别

来自分类Dev

python中r'.*'和'[.*]'正则表达式有什么区别?

来自分类Dev

函数模板和lambda表达式之间的区别

来自分类Dev

XML模式中的ref和type有什么区别?

来自分类Dev

JSON模式中的AdditionalItems和AdditionalProperties有什么区别?

来自分类Dev

z模式中的“ anyof”和“ oneof”有什么区别?

来自分类Dev

MVC模式中的模型和实体有什么区别?

来自分类Dev

模式和路径有什么区别?

来自分类Dev

在PHP fopen函数中,w和w +模式有什么区别?

来自分类Dev

大括号和逗号在用于分隔匹配表达式的两臂之间有什么区别?

来自分类Dev

逻辑模式和物理模式有什么区别?

来自分类Dev

逻辑模式和物理模式有什么区别?

来自分类Dev

只读接口模式和外观模式有什么区别?

Related 相关文章

  1. 1

    Scala匹配表达式中的构造函数模式和变量绑定模式有什么区别?

  2. 2

    C ++中的原型设计模式和复制构造函数有什么区别

  3. 3

    Scala中的表达式和语句有什么区别

  4. 4

    构造函数模式和原型模式之间的区别

  5. 5

    Scala:Scala中的模式匹配和匹配表达式是否相同?

  6. 6

    使用函数和使用内联表达式设置作用域变量之间有什么区别

  7. 7

    如何在scala中的foreach函数中的正则表达式上进行模式匹配?

  8. 8

    模式匹配 Scala 中的正则表达式数组

  9. 9

    正则表达式[-+]有什么区别?和(-| +)?

  10. 10

    将函数的引用和 lambda 表达式作为参数传递时有什么区别?

  11. 11

    在模式匹配中结合变量和正则表达式

  12. 12

    [\ s \ S] *之间有什么区别?和 。*?在Java正则表达式中?

  13. 13

    Django URL的正则表达式中的r''和r'^ $'有什么区别?

  14. 14

    bash的条件表达式中-a和-e有什么区别?

  15. 15

    (。*?)和(。*)有什么区别?在正则表达式中?

  16. 16

    正则表达式和javascript中的字符串有什么区别?

  17. 17

    正则表达式中<p>(。+?)<\ / p>和(?<= <p>)(。+?)(?= <\ / p>)之间有什么区别

  18. 18

    python中r'.*'和'[.*]'正则表达式有什么区别?

  19. 19

    函数模板和lambda表达式之间的区别

  20. 20

    XML模式中的ref和type有什么区别?

  21. 21

    JSON模式中的AdditionalItems和AdditionalProperties有什么区别?

  22. 22

    z模式中的“ anyof”和“ oneof”有什么区别?

  23. 23

    MVC模式中的模型和实体有什么区别?

  24. 24

    模式和路径有什么区别?

  25. 25

    在PHP fopen函数中,w和w +模式有什么区别?

  26. 26

    大括号和逗号在用于分隔匹配表达式的两臂之间有什么区别?

  27. 27

    逻辑模式和物理模式有什么区别?

  28. 28

    逻辑模式和物理模式有什么区别?

  29. 29

    只读接口模式和外观模式有什么区别?

热门标签

归档