scala匹配表达式中的构造函数模式和变量绑定模式有什么区别?
What is difference between Constructor pattern and variable binding pattern in scala match expression?
在 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
在模式匹配方面,我总是很困惑?
构造器与提取器
您调用构造函数的模式在大多数情况下称为 Extractor
或 Deconstructor
。
它就像一个反向构造函数,你可以通过它调用的方法看到 unapply
.
如果它出现在 pattern match
的右手边或外面,它就会像您所说的那样 Constructor
。
回答
@
仅在pattern matching
中用于将解构的实体绑定到变量。
它的目的是提供捕获整个表达式的选项,并且仍然能够在后续步骤中使用提取的值。
所以总有一种方法可以以一种您不需要使用的方式来安排代码@
,但它可以大大提高可读性。
例子
@
的用法示例是:
您想向所有 年龄大于“21”的名为“Alice”的人发送邮件,但地址不是重要的选择标准。
case p @ Person("Alice", age, _) if age > 21 => storePersonForMailing(p)
这里的模式匹配通过强调您用于选择的值清楚地表明了您的意图,并且由于您稍后需要地址来发送邮件,因此最好不要删除它。
在 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
在模式匹配方面,我总是很困惑?
构造器与提取器
您调用构造函数的模式在大多数情况下称为 Extractor
或 Deconstructor
。
它就像一个反向构造函数,你可以通过它调用的方法看到 unapply
.
如果它出现在 pattern match
的右手边或外面,它就会像您所说的那样 Constructor
。
回答
@
仅在pattern matching
中用于将解构的实体绑定到变量。
它的目的是提供捕获整个表达式的选项,并且仍然能够在后续步骤中使用提取的值。
所以总有一种方法可以以一种您不需要使用的方式来安排代码@
,但它可以大大提高可读性。
例子
@
的用法示例是:
您想向所有 年龄大于“21”的名为“Alice”的人发送邮件,但地址不是重要的选择标准。
case p @ Person("Alice", age, _) if age > 21 => storePersonForMailing(p)
这里的模式匹配通过强调您用于选择的值清楚地表明了您的意图,并且由于您稍后需要地址来发送邮件,因此最好不要删除它。