【发布时间】:2017-05-11 02:17:07
【问题描述】:
我正在尝试理解 scala unapply 方法。
以下是我的理解。假设我有一个 Person 对象:
class Person(val fname: String, val lname: String)
object Person{
def unapply(x: Person) : Option[(String, String)] =
Some(x.fname,x.lname)
}
new Person("Magic", "Mike") match {
case Person(x, y) => s"Last Name is ${y}"
case _ => "Unknown"
}
我认为这个案例调用如下:
val temp = Person.unapply(new Person("Magic", "Mike"))
if (temp != None) { val (x, y) = temp.get }
else { <go to next case> }
但是当我有以下情况时,下面的 unapply 是如何工作的:
new Person("Magic", "Mike") match {
case Person("Harold", y) => s"Last Name is ${y}"
case Person("Magic", y) => s"Last Name is ${y}"
case _ => "Unknown"
}
它如何在 unapply 方法中访问 fname("Magic") 的值并给我与第一个相同/正确的结果?
【问题讨论】:
-
这太神奇了!说真的,关于“它是如何工作的”在哪里没有太多了解。 Scala 编译器看到
Person(foo, bar)并将其替换为对Person.unapply的调用并使用适当的参数,检查返回,并将值分配给提供的变量或将它们与给定的常量匹配。
标签: scala pattern-matching unapply