Normalmente, se si crea un oggetto Stream
, la testa sarà valutata con entusiasmo:Quando viene valutata la testa di uno stream?
scala> Stream({println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Se creiamo un flusso a cui anteporre nella stessa istruzione, sembra un po 'sorprendente che la testa non viene valutato prima di la concatenazione. vale a dire
scala> 0 #:: Stream({println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)
(#::
è giusto-associativa ed è il metodo prepend su ConsWrapper
, che è una classe implicita di Stream
.)
Come si fa a non valutare la testa prima di anteponendo il 0? È che la coda Stream (o contro cella) non esiste nell'heap fino a quando non prendiamo i valori dal flusso risultante? Ma se sì, come chiamiamo il metodo #::
su un oggetto che non esiste ancora?
Suggerisco di usare 'javap' per capire cosa sta succedendo. –
L'ho capito guardando la fonte (supponendo che la mia risposta sia corretta) –