2013-08-28 3 views
13

кто-то может помочь мне понять этот код, что этот символ Scala -> _ означает

case "Foo" Foo(data) -> _ => { /*.. implementation */} 

Я вижу использование Foo.unapply (данные) , но я не понимаю, что эта часть

-> _

, как и когда использовать его

+0

Существует популярный вопрос, который также охватывает вашу проблему http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators –

+1

Кстати, вы можете легко понять этот код, если вы используете intellij http: //gyazo.com/dcf31d20ccb925bed0e302fd45df7710.png, или если вы обработали его с помощью рентгеновского снимка scala http://scastie.org/2026 – OlegYch

ответ

26

It се oks как кто-то путь слишком умный для своих же благ. Предположим, что у меня есть следующие:

case class Foo[A](command: String, data: A) 

object -> { def unapply[A, B](p: (A, B)) = Some(p) } 

Теперь я могу написать это:

scala> Foo("foo", (42, 'whatever)) match { 
    | case "foo" Foo(data) -> _ => data 
    | } 
res0: Int = 42 

Благодаря магии шаблонов инфиксные Scala, это эквивалентно следующему:

Foo("foo", (42, 'whatever)) match { 
    case Foo("foo", data -> _) => data 
} 

За исключением того, что версия инфикса гарантированно запутает и раздражает будущих читателей вашего кода.

+1

+1, потому что вы поняли случай сразу. И для волшебства scala –

+1

Wow. Я не знал, что компилятор может выполнить _that_ transform - перемещение '-> _' внутри парнов, по существу? Или это не то, что происходит? –

+2

@RexKerr: Скобки на самом деле не выполняют никакой работы здесь - вы могли бы так же хорошо (то есть, ужасно) написать «case» foo «Foo data -> _'. –

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