2013-10-04 23 views
1

Я просматриваю некоторый код Scala, пытаясь выучить язык. Столкнулся кусок, который выглядит следующим образом:Что означает `var @ _ *` в Scala

case x if x startsWith "+" => 
      val s: Seq[Char] = x 
      s match { 
      case Seq('+', rest @ _*) => r.subscribe(rest.toString){ m => } 
      } 

В этом случае, что именно rest @ _* делать? Я понимаю, что это pattern match для последовательности, но я не совсем понимаю, что должен сделать этот второй параметр в Sequence.

попросили больше контекста, поэтому я добавил блок кода я нашел это.

+0

Просьба предоставить больше контекста. –

+0

Извините, я ошибся - дополнительный контекст не нужен :) –

+0

См. Также [привязка значения] (http://stackoverflow.com/a/2359365/298389). Вы действительно являетесь композицией * привязки значения * с * синтаксисом сахара * varargs *. –

ответ

5

Если вы наткнулись _* раньше в виде применения Seq в качестве переменной длины к некоторому методу/конструктору, например:

val myList = List(args: _*) 

, то это «Исключить» (более конкретно, искать «unapplySeq "): выполните последовательность и вернитесь к« varargs », затем присвойте результат rest.

2

x @ p соответствует шаблону p и связывает результат всего матча к x. Этот шаблон соответствует Seq, содержащему '+', за которым следует любое число (*) неназванных элементов (_) и привязывает rest к Seq из этих элементов.

+1

Является ли '*' именем экстрактора или синтаксическим? – Owen

+0

Что было бы здорово и есть какая-то терминология, я могу google увидеть больше примеров/объяснений. Я попробовал поиск соответствия шаблону, но он не попадает в экстракторы или что-то подобное. – randombits

+1

@randombits Я пробовал поиск по «scala pattern match unapplySeq» и ​​придумал [эту ссылку] (http://daily-scala.blogspot.com.au/2009/09/extract-sequences-unapplyseq.html) – Shadowlands

Смежные вопросы