【问题标题】:What is difference between Constructor pattern and variable binding pattern in scala match expression?scala匹配表达式中的构造函数模式和变量绑定模式有什么区别?
【发布时间】:2016-03-23 07:38:34
【问题描述】:

在 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

我总是对模式匹配感到困惑?

【问题讨论】:

    标签: scala pattern-matching case-class


    【解决方案1】:

    构造器与提取器

    您调用构造函数的模式在大多数情况下称为ExtractorDeconstructor。 从它调用unapply的方法可以看出,它就像一个逆向构造函数。

    如果它发生在右侧或pattern match 之外,它会像您记下的Constructor

    回答

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

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

    示例

    @ 的用法示例是: 您想向所有名为“Alice”且年龄超过“21”但地址不是重要选择标准的人发送邮件

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

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

    【讨论】:

    • 非常有帮助的特别例子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多