scala> Stream({println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Wenn wir einen Bach, auf die wir in der gleichen Aussage voranstellen, übernimmt es etwas überraschend scheint, dass der Kopf nicht vor ausgewertet wird die Verkettung. d.h.
scala> 0 #:: Stream({println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)
(#::
ist rechtsassoziativ und ist das Verfahren auf prepend ConsWrapper
, die eine implizite Klasse von Stream
.)
Wie dies den Kopf nicht bewerten, bevor die 0 Voranstellen? Ist der Tail Stream (oder die Cons-Zelle) nicht auf dem Heap vorhanden, bis wir Werte aus dem resultierenden Stream ziehen? Aber wenn ja, wie rufen wir die Methode #::
für ein Objekt auf, das noch nicht existiert?
Ich schlage vor, Sie 'javap' zu verwenden, um zu verstehen, was vor sich geht. –
Ich habe herausgefunden, dass die Quelle (vorausgesetzt, meine Antwort ist korrekt) –