Что означает #:: в Scala?

#scala

#scala

Вопрос:

Что означает x#::xs в Scala?

например

  case x #:: xs => {
  

В этом случае x был потоком, но я полагаю, что тот же синтаксис действителен и для списка ecc…

Ответ №1:

Это экстрактор для потоков сопоставления с образцом. Это недопустимо для списков. В списках есть :: (обратите # внимание, что в списке нет).

Смысл case x #:: xs => в том, что при сопоставлении шаблона x он будет содержать начало потока, а xs остальная часть потока (хвост) будет содержать.

Проверьте документацию stream для получения примеров определения потоков.

Комментарии:

1. эквивалентно ли это x::xs для списка?

2. @Donbeo да, x :: xs в списках эквивалентно x #:: xs в потоках при сопоставлении с образцом. Вы также можете проверять объекты экстрактора .

3. ОК. Насколько я понимаю, поток вычисляется только при его вызове. В этом случае вычисляются первый и второй элементы потока? (Для проверки соответствия шаблону)

4. Только первый ( x ) и первый из tail ( xs ) . Остальное не нужно оценивать. Но обратите внимание, что поток вычисляется с задержкой, что означает, что его элементы оцениваются только один раз, а затем значение кэшируется.