Kotlin programozás tanulása
Prímszámot generáló Kotlin csatornák csővezetékek illusztrálva
A Kotlin Channels Pipeline tanulásának megkönnyítése diagram segítségével
A Kotlin-dokumentáció, amely leírja a Channel Pipeline-t egy prímszám-generátor algoritmusra történő alkalmazásával.
«Csatornák
A késleltetett értékek kényelmes módot biztosítanak egyetlen érték átvitelére a korutinok között. A csatornák lehetőséget biztosítanak a…kotlinlang.org”
A kód az alábbiak szerint, tömör és
import kotlinx.coroutines.* import kotlinx.coroutines.channels.* fun main() = runBlocking { var cur = numbersFrom(2) repeat(10) { val prime = cur.receive() println(prime) cur = filter(cur, prime) } coroutineContext.cancelChildren() // cancel all children to end } fun CoroutineScope.numbersFrom(start: Int) = produce<Int> { var x = start while (true) send(x++) // infinite stream of integers from start } fun CoroutineScope.filter( numbers: ReceiveChannel<Int>, prime: Int ) = produce<Int> { for (x in numbers) if (x % prime != 0) send(x) }
A futás eredménye 10 prímszámot generál.
Megpróbálni elképzelni, hogyan történik ez egy kicsit trükkös számomra. Tehát az alábbiak szerint rajzolom ki.
A fenti diagram legfeljebb 7 prímszámot mutat. De könnyen kibővíthető az ötlet, hogy megnézzük, hogyan jön létre a 10 prímszám.
További magyarázat alább
A fenti ábra alapján
The Number From Producer
- az első csatorna 2-től kezdődően állít elő számokat. Amikor a
cur.receive()
aktiválódik, a következő számoknál generál stb. - Az első 2 a prímszám kimenet kimeneteként.
- A következő szám, azaz a 3-tól a
filter(2)
csővezetékre lesz betáplálva.
A szűrő(2) gyártója
- A
filter(2)
megkapja az összes számot 3-tól kezdődően, és eltávolítja a 2-vel osztható számokat, mielőttsend
kilépne a következő törvényes számból. - Az
fitler(2)
első kimenete, amely 3, a prímszám kimenetként kerül kiküldésre. - A következő szám, azaz az 5, 7, 9 stb. (csak azok, amelyek nem oszthatók 2-vel), a
filter(3)
folyamatba lesznek betáplálva.
A szűrő(3) gyártója
- A megadott szám alapján a
filter(3)
eltávolít minden olyan számot, amely osztható 3-mal, mielőttsend
a következő törvényes számból. - A
fitler(2)
első kimenete, amely 5, a prímszám kimenetként kerül kiküldésre. - A következő szám, azaz 5, 11, 13, 17, 19 stb. (csak azok, amelyek nem oszthatók 3-mal), a
filter(5)
csővezetékre lesznek betáplálva.
A szűrő(5) gyártója
- A megadott szám alapján a
filter(5)
eltávolítja az 5-tel osztható számokat, mielőtt asend
a következő törvényes számból kerül ki. - A
fitler(5)
első kimenete, amely 7, a prímszám kimenetként kerül kiküldésre. - A fenti ábra alapján a bt
filter(3)
megadott számok nem oszthatók 5-tel, kivéve 25-öt. Így minden szám átfolyikfilter(7)
-be, kivéve a 25-öt kiszűrtük.
A szűrő(7), szűrő(11), szűrő(13) gyártó
- Ezeknél a szűrőknél a nekik adott szám (a fenti ábra szerint) egyikkel sem osztható, így szűrő nélkül jutott el a következő gyártóhoz.
- Ha több számot generálunk, akkor a velük oszthatóakat kiszűrjük.
Reméli, hogy a fenti illusztráció sokkal világosabb képet ad arról, hogyan használható a Kotlin-csatorna a prímszámok generálására.