2016-03-28 14 views
0

For-verim bloğundaki bir scalada kontrol akışını merak ediyordum. Görüyorum ki tüm elementler ilk önce 'for' bölümünden sonra 'get' kısmını takip ediyor. Neden? öyle değil KodunuzScala-verim denetim akışı

scala> val list = List(1,2,3,4,5,6) 
list: List[Int] = List(1, 2, 3, 4, 5, 6) 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

val t = for { 
    i <- list 
    log = println("processing " + i) 
} yield { 
    println("In yield for " + i) 
    i 
} 

// Exiting paste mode, now interpreting. 

processing 1 //All of them first go through the for block 
processing 2 
processing 3 
processing 4 
processing 5 
processing 6 
In yield for 1 // yield comes after all 
In yield for 2 
In yield for 3 
In yield for 4 
In yield for 5 
In yield for 6 
t: List[Int] = List(1, 2, 3, 4, 5, 6) 
+0

Bu, ilk öğenizin türüne göre değişir. "List" yerine "Stream" i deneyin. – Dima

+0

Bu yorumu detaylandırır mısınız? Denenmiş akışı ve sadece ilk elemanı işler. Neden liste böyle davranır merak ettiğim şeydir. – Richeek

+0

"Liste bu paticular yolunu harekete geçirir", çünkü bu şekilde uygulanır. 'Stream', farklı bir şekilde uygulanır. ".toList" kelimesini ekleyerek "sadece ilk öğeyi işleyen" parçasının sonuna kadar – Dima

cevap

3

... için-verim Element2 için, element1 için için-verim olmalı

val t = for { 
    i <- list 
    log = println("processing " + i) 
} yield { 
    println("In yield for " + i) 
    i 
} 

kabaca Buradan

val t = list.map { i => 
    val log = println("processing " + i) 
    (i, log) 
}.map { x => 
    x match { 
     case (i, log) => 
      println("In yield for " + i) 
    } 
} 

içine desugars neden görebilirsiniz İlk önce tüm "işleme ..." mesajlarını alırsınız.

+0

teşekkürler. Mantıklı – Richeek