2011-10-28 18 views
10

ile çalışmaz? Aşağıdaki kod "* 1" yazdırır. Ne gizemli oluyor ben yorumunu kaldırırsanız ben hepsindenNeden benim yolumDevam

var max = 0 
lazy val list: Stream[Int] = 1 #:: Stream.from(2) 
list.takeWhile { 
    x => 
    max = x 
    x < 4 
}//.foreach(println) 
println("*" + max) 

cevap

20

İlk bekliyordum budur "* 4" döndürür şudur: ikinci satırında lazy yapmıyor şey-onu kaldırmak ve alabilirsiniz aynı sonuç.

Daha da önemlisi: takeWhile aslında tembel, ki bu sadece başka Stream döndürür ve ihtiyaç olana kadar o akışın kafasına geçmiş hiçbir şey değerlendirilecektir olduğunu. Aşağıdaki düşünün:

val s = Stream.from(1).takeWhile(_ > 0) 

Sen ve ben s sonsuz akışı olacak biliyorum, ama biz repl çalıştırıp bu yazarsanız, onu değerlendirmek gayet mutlu açıklanmıştır:

scala> val s = Stream.from(1).takeWhile(_ > 0) 
s: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

Örneğinizde de aynı şey oluyor: takeWhile'a ilettiğiniz (Int) ⇒ Boolean, foreach gibi bir şey gerekli olana kadar akış başının ötesindeki herhangi bir öğeyle beslenmeyecektir.

Sen takeWhile yüklem içinde bir println gibi bir şey ekleyerek bu daha da dramatik görebilirsiniz: Açıkça

scala> val s = Stream.from(1).takeWhile { x => println("Checking: " + x); x < 4 } 
Checking: 1 
s: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

scala> val l = s.toList 
Checking: 2 
Checking: 3 
Checking: 4 
l: List[Int] = List(1, 2, 3) 

biz değerlendirilmesi zorla kadar sadece akışın kafa için çağrılan yüklem toList numaralı telefonu arayarak akışın geri kalanı.

İlgili konular