Если кто-то может объяснить это поведение простым английским языком, я был бы очень признателен. В частности, существует ли разница между 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")
}
Ааа я получаю сейчас, 'случай Foo()' на самом деле вызова 'Foo.unapply', а потому, что это пустой список параметров нечего извлекать. Я знаю, что третий случай немного странный, но я думаю, что это распространенная ошибка, поэтому я хотел включить его как «oops» для других, читающих – Hamy
@Hamy. Третий случай - это не странно - вы делаете это, когда хотите чтобы соответствовать * значению *, а не структуре. Поэтому, если у вас есть случай «запечатанной черты», который не несет каких-либо данных, как сослались на johanandren, вы можете сделать это «случайным объектом» и соответствовать ему таким образом. Вы также можете так же соответствовать литеральным значениям. Есть и другой тип дела, который использует обратные элементы для сопоставления с ранее определенной переменной. – acjay
@acjay - Конечно, все замечательные советы. Возможно, странное было неправильным словом, я имел в виду, что я считаю, что люди часто путают «случай Foo» с «case Foo()», не понимая, что первое, вероятно, не делает то, что они намеревались. Например, см. Http://stackoverflow.com/questions/2254710/why-were-the-case-classes-without-a-parameter-list-deprecated, где в первом ответе упоминается эта путаница – Hamy