2014-09-20 4 views
0

Если кто-то может объяснить это поведение простым английским языком, я был бы очень признателен. В частности, существует ли разница между case _:Foo и case Foo()?Соответствие класса случаев

myvariable match { 
    case _: Foo => println("its a foo!") 
    case Foo() => println("It's also a Foo") 
    case Foo => println("Oops, this will *not* match a Foo! It will never be called") 
    case _ => println("This will be called for all unmatched items") 
} 

ответ

4

Это обычное совпадение типа, похожее на instanceOf в Java, например.

case x: Foo => ??? 

Это гарантирует, что вы можете использовать й как Foo на правой стороне

case Foo(a,b,c) => ??? 

С другой стороны, пытается вызвать исключить его (который вы получаете бесплатно на случае классе) и позволяет вы должны «втянуться» в экземпляр и поймать все поля как vals, которые вы можете использовать с правой стороны.

Сторона примечания: определение класса case без полей по существу идентично использованию объекта case, что и большинство людей в Scala, просто представляют одно возможное значение. Таким образом, ваш второй случай является немного странным, и, вероятно, довольно быть сделано с помощью тематических объектов:

case object Foo 

case Foo => ??? 
+0

Ааа я получаю сейчас, 'случай Foo()' на самом деле вызова 'Foo.unapply', а потому, что это пустой список параметров нечего извлекать. Я знаю, что третий случай немного странный, но я думаю, что это распространенная ошибка, поэтому я хотел включить его как «oops» для других, читающих – Hamy

+1

@Hamy. Третий случай - это не странно - вы делаете это, когда хотите чтобы соответствовать * значению *, а не структуре. Поэтому, если у вас есть случай «запечатанной черты», который не несет каких-либо данных, как сослались на johanandren, вы можете сделать это «случайным объектом» и соответствовать ему таким образом. Вы также можете так же соответствовать литеральным значениям. Есть и другой тип дела, который использует обратные элементы для сопоставления с ранее определенной переменной. – acjay

+0

@acjay - Конечно, все замечательные советы. Возможно, странное было неправильным словом, я имел в виду, что я считаю, что люди часто путают «случай Foo» с «case Foo()», не понимая, что первое, вероятно, не делает то, что они намеревались. Например, см. Http://stackoverflow.com/questions/2254710/why-were-the-case-classes-without-a-parameter-list-deprecated, где в первом ответе упоминается эта путаница – Hamy

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