0

我是一名在韩国学习 Scala 的学生。我正在学习模式匹配和取消应用方法。我感到困惑的是Emergency对象在 unapply 方法中有一个参数。当我不将参数放在匹配块中时,我不知道原因。

object Solution {

  def main(args: Array[String]) {

    val number1 = "010-123-1234"
    val number2 = "119"
    val number3 = "포도먹은 돼지"
    val numberList = List(number1, number2, number3)

    for (number <- numberList) {
      number match {
        case Emergency() => println("긴급전화다")
        case Normal(number) => println("일반 전화다" + number)
        case _ => println("판단할 수 없습니다.")
      }
    }
  }
}

object Emergency {
  def unapply(number: String): Boolean = {
    if (number.length == 3 && number.forall(_.isDigit)) true
    else false
  }
}

object Normal {
  def unapply(number: String): Option[Int] = {
    try {
      Some(number.replaceAll("-", "").toInt)
    } catch {
      case _: Throwable => None
    }
  }
}
4

2 回答 2

2

请注意,tounapply方法的返回类型是不同的。

Normal.unapply返回一个Option. 当你这样做时case Normal(foo),unapply被调用,如果它返回Some(number),则匹配成功,并将number分配给局部变量foo,如果返回None,则匹配失败。

Emergency.unapply返回 a Booleancase Emergency()如果返回 则成功true,否则失败,但如果成功则没有结果可分配,因此没有“参数”。

于 2018-11-08T14:54:26.350 回答
1

unapply 中的参数是您要匹配的对象。

在这种情况下,numberString 变量被传递给Emergency.unapplyNormal.unapply

这个链接很好地解释了事情:

https://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html

于 2018-11-08T14:54:48.320 回答