Обычно, если вы создаете объект Stream
, заголовок будет с готовностью оцениваться:
scala> Stream( {println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Если мы создадим Stream к которому мы присоединяемся в том же операторе, кажется немного удивительным, что заголовок не оценивается до конкатенации, т. е.
scala> 0 #:: Stream( {println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)
( #::
является правоассоциативным и является методом добавления в ConsWrapper
, который является неявным классом Stream
.)
Почему это не оценивает свой заголовок перед добавлением 0? Дело в том, что хвостовой поток (или cons-ячейка) не существует? в куче, пока мы не возьмем значения из результирующего Stream? Но если да, то как мы вызовем метод #::
для объекта, который еще не существует?