Normalnie po utworzeniu Stream
obiekt, szef będzie chętnie oceniane:Kiedy dokładnie obliczana jest głowa strumienia?
scala> Stream({println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Jeśli stworzymy Stream do którego poprzedzić w tym samym oświadczeniu, wydaje się nieco zaskakujące, że szef nie jest oceniana przed konkatenacja. tj
scala> 0 #:: Stream({println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)
(#::
jest tuż-asocjacyjne i jest metoda prepend na ConsWrapper
, który jest niejawny klasa Stream
.)
Jak to nie ocenia jego głowę przed poprzedzenie 0? Czy to jest, że Strumień Ogonowy (lub komórka po) nie istnieje na stercie, dopóki nie przyjmiemy wartości z powstałego strumienia? Ale jeśli tak, jak nazwać metodę #::
na obiekcie, który jeszcze nie istnieje?
Proponuję użyć 'javap', aby zrozumieć, co się dzieje. –
Odkryłem to patrząc na źródło (zakładając, że moja odpowiedź jest poprawna) –