一般来说,如果你创建一个Stream
对象时,头部会急切地评价:什么时候流的头部被评估?
scala> Stream({println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
如果我们创造,我们在同一个语句前面加上流,似乎稍稍令人意外的是,头未评估前串联。即
scala> 0 #:: Stream({println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)
(#::
是右结合并且是ConsWrapper
的前置方法,该方法是隐式类Stream
。)
这是如何不前面加上0之前评估其头?是否直到我们从结果流中取值,尾流(或cons单元)才存在于堆上?但是如果是这样的话,我们如何在尚不存在的对象上调用#::
方法?
我建议你使用'javap'来理解发生了什么。 – 2012-03-25 02:14:48
我想出来看看源代码(假设我的回答是正确的) – 2012-03-25 06:52:59