Scala не используется без параметра

Я студент, который изучает 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
    }
  }
}

2 ответа

Решение

Обратите внимание, что возвращаемые типы unapply методы разные.

Normal.unapply возвращает Option, Когда вы делаете case Normal(foo), unapply называется, и, если он возвращает Some(number), матч прошел успешно, и number присваивается локальной переменной fooи если он вернется NoneМатч не удался.

Emergency.unapply возвращает Boolean, так case Emergency() успешно, если он возвращается trueи завершается неудачно в противном случае, но в случае успеха результат не присваивается, таким образом, отсутствует "параметр".

Параметр unapply - это объект, к которому вы подходите.

В этом случае number Строковая переменная передается Emergency.unapply, Normal.unapply и т.п.

Эта ссылка объясняет вещи красиво:

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

Другие вопросы по тегам