Почему List (_ *) не соответствует списку (4,18,52) в выражении соответствия Scala? - PullRequest
1 голос
/ 20 декабря 2010

Я работаю с книгой O'Reilly Programming Scala и наткнулся на камень преткновения с примером кода:

/* matching on sequences */
val willWork = List(1, 3, 23, 90 );
val willNotWork = List( 4, 18, 52 );
val empty = List();

for( l <- List(willWork, willNotWork, empty ))
{
    l match
{
  case List( _, 3, _, _ ) => println( "Four elements, with the second being '3'." );
  case List( _* ) => println( "Any other list with zero or more elements" );
  case _ => println( "Uh, oh!" );
}
}     

Согласно тексту, список (_ *) должен соответствовать любому списку с нулевым или большим количеством элементов, но когда я его выполняю, список (4,18,52) не совпадает и попадает в раздел case _ (или, если он удален, выдается ошибка MatchEr).

Есть идеи, почему это не соответствует? Произошли ли какие-либо изменения в языке с момента публикации книги, или у меня просто происходит одна из тех «опечаток, которые вы не видите сами»?

1 Ответ

3 голосов
/ 20 декабря 2010

Какую версию Scala вы используете?

В Scala 2.8.1.final он будет жаловаться, что последняя case недоступна.

scala> val willWork = List(1, 3, 23, 90 );
willWork: List[Int] = List(1, 3, 23, 90)

scala> val willNotWork = List( 4, 18, 52 );
willNotWork: List[Int] = List(4, 18, 52)

scala> val empty = List();
empty: List[Nothing] = List()

scala> 

scala> for( l <- List(willWork, willNotWork, empty ))
     | {
     |     l match
     | {
     |   case List( _, 3, _, _ ) => println( "Four elements, with the second being '3'." );
     |   case List( _* ) => println( "Any other list with zero or more elements" );
     |   case _ => println( "Uh, oh!" );
     | }
     | }     
<console>:15: error: unreachable code
         case _ => println( "Uh, oh!" );
                          ^

scala> 

И она отлично работает длясоответствовать пустому списку.

scala> val willWork = List(1, 3, 23, 90 );
willWork: List[Int] = List(1, 3, 23, 90)

scala> val willNotWork = List( 4, 18, 52 );
willNotWork: List[Int] = List(4, 18, 52)

scala> val empty = List();
empty: List[Nothing] = List()

scala> 

scala> for( l <- List(willWork, willNotWork, empty ))
     | {
     |     l match
     | {
     |   case List( _, 3, _, _ ) => println( "Four elements, with the second being '3'." );
     |   case List( _* ) => println( "Any other list with zero or more elements" );
     | }
     | }
Four elements, with the second being '3'.
Any other list with zero or more elements
Any other list with zero or more elements

scala> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...