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