Почему оба эти экстрактора сопоставления с образцом скалы вызывают правильный синтаксис? - PullRequest
2 голосов
/ 20 марта 2012

ТЛ; др;Это из-за инфиксных операторов, ничего общего с экстракторами

Я играл с экстракторами в scala и обнаружил тот факт, что оба приведенных ниже случая с правильным синтаксисом немного озадачивают ?!В чем дело?

class Foo(val items:List[String], val number:Int)

object FooEnough {
  def unapply(f:Foo):Option[(List[String], Int)] = if(f.number > 2) Some(f.items, f.number) else None
}

val foo = new Foo("a" :: "b" :: "c" :: Nil, 3)
val matches:String = foo match {
  case FooEnough("a" :: "b" :: "c" :: Nil, 3) => "first case"
  case "a" :: "b" :: "c" :: Nil FooEnough 4 => "second case"
}
//matches == "first case"

Если я создаю другой экстрактор, который извлекает 3 параметра, как я должен вызывать его с использованием синтаксиса, как во втором случае выше?

object FooSpectrum {
  def unapply(f:Foo):Option[(String, List[String], Int)] =
    if(f.number > 2) Some("zx", f.items, f.number) else None
}

foo match {
  case FooSpectrum("zx", "a" :: "b" :: "c" :: Nil, 3) => "first case" //compiles
  case "zx" FooSpectrum "a" :: "b" :: "c" :: Nil 4 => "second case" //doesn't compile
}

1 Ответ

4 голосов
/ 20 марта 2012

Это из-за того, что предоставляет инфиксный оператор magic scala. Вы также можете написать String Map Int вместо Map[String,Int]. Это работает только для двоичных типов / функций, потому что не имеет смысла для более чем двух аргументов, а также будет трудно разобрать.

...