Ищите примеры того, как использовать "@ _ *" при сопоставлении с образцом в Scala - PullRequest
7 голосов
/ 23 февраля 2010

Я искал немного, но не могу найти ни одного примера, демонстрирующего использование @ _ * при сопоставлении шаблонов с классами случаев.

Ниже приведен пример приложения, о котором я говорю.

def findPerimeter(o: SomeObject): Perimeter = o match {
case Type1(length, width) =>
  new Perimeter(0, 0, length, width)
case Type2(radius) =>
  new Perimeter(0, 0, 2*radius, 2*radius)
...

case MixedTypes(group @_*) => {
  \\How could @_* be used to check subpatterns of group?
}

}

Если бы кто-то мог показать мне несколько примеров или указать мне на веб-страницу, на которой есть несколько примеров, которые были бы великолепны.

Спасибо

Ответы [ 2 ]

5 голосов
/ 23 февраля 2010

Помните, что-то вроде

Type2(3.0) match {
  case t2 @ Type2(radius) => //...
}

связывает radius со значением 3.0 и связывает t2 с экземпляром Type2, с которым сопоставляется.

Используя ваш пример:

def findPerimeter(o: SomeObject): Perimeter = o match {
  case Type1(length, width) => new Perimeter(0, 0, length, width)
  case Type2(radius) => new Perimeter(0, 0, 2*radius, 2*radius)
  // ...
  // assume that Perimeter defines a + operator
  case MixedTypes(group @ _*) => group.reduceLeft(findPerimeter(_) + findPerimeter(_))

}

Здесь group связан с последовательностью SomeObject s, которые определяют MixedTypes. Вы можете обрабатывать это как последовательность параметров конструктора args-for-MixedTypes-is.

3 голосов
/ 23 февраля 2010

Программирование Scala от Wampler / Payne имеет пример .

Также еще один ТАК вопрос: Шаблон, соответствующий строке как Seq [Char]

И сообщение в блоге Daily Scala unapplySeq .

...