Почему этот параметр преобразуется в строку? [Scala] - PullRequest
2 голосов
/ 14 декабря 2009

Я все еще новичок в Scala, и это меня смущает:

import java.util.regex._

object NumberMatcher {
  def apply(x:String):Boolean = {
    val pat = Pattern.compile("\\d+")
    val matcher = pat.matcher(x)
    return matcher.find
  }

  def unapply(x:String):Option[String] = {
    val pat = Pattern.compile("\\d+")
    val matcher = pat.matcher(x)
    if(matcher.find) {
      return Some(matcher.group())
    }
    None
  }
}

object x {
  def main(args : Array[String]) : Unit = {
    val strings = List("geo12","neo493","leo")
    for(val string <- strings) {
      string match {
        case NumberMatcher(group) => println(group)
        case _ => println ("no")
      }
    }
  }
}

Я хотел добавить сопоставление с образцом для строк, содержащих цифры (чтобы я мог больше узнать о сопоставлении с образцом), и в unapply я решил вернуть Option[String]. Однако в println в случае NumberMatcher group рассматривается как строка, а не как Option. Можете ли вы пролить свет? Результат, полученный при запуске:

12,493,no

1 Ответ

5 голосов
/ 14 декабря 2009

Взгляните на этот пример .

Метод unapply возвращает Some value, если ему удалось извлечь его, в противном случае None. Так что внутренне

case NumberMatcher(group) => println(group)

вызывает unapply и проверяет, возвращает ли оно некоторое значение . Если это так, мы уже должны получить истинный результат, и поэтому тип Option не останется. Сопоставление с образцом извлекает возвращаемое значение из опции .

...