Скаля пользуюсь без параметра - PullRequest
0 голосов
/ 08 ноября 2018

Я студент, который изучает Scala в Корее. Я изучаю сопоставление с образцом и методы неприменения. Что меня смущает, так это то, что у объекта Emergency есть параметр в методе неприменения. Я не могу знать причину, когда я не помещаю параметр в блок совпадений.

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 ]

0 голосов
/ 08 ноября 2018

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

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

Эта ссылка хорошо объясняет:

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

0 голосов
/ 08 ноября 2018

Обратите внимание, что типы возвращаемых значений для unapply отличаются.

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

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

...