2017-12-22 130 views
5

Nie rozumiem, jak przekazać Coroutine, gdy Iterable jest potrzebne.Kotlin: jak przekazać sekwencję (coroutine) jako Iterable <T>

Przyjmijmy, mam następującą funkcję:

fun <T> iterate(iterable: Iterable<T>) { 
    for (obj in iterable) { 
     // do something.. 
    } 
} 

Chcę przekazać współprogram:

iterate(?? { 
    for (obj in objects) { 
     yield(transform(obj)) 
    } 
}) 

Co mam umieścić zamiast ?? to zadziałało? Próbowałem buildIterator i buildSequence, ale żaden z nich nie działa.

+1

Casting 'buildSequence {...} asIterable()' powinno wystarczyć. – yegodm

Odpowiedz

6

Można użyć asIterable().

val seq = buildSequence { 
    for (i in 1..5) { 
     yield(i) 
    } 
}.asIterable() 

iterate(seq) 
+0

Dzięki. Chociaż nie rozumiem, dlaczego nie ma "buildIterable" w standardowej lib .. Dodałem go do moich utils jako 'buildSequence (builderAction) .asIterable()' –