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

  1. 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.
  2. Az első 2 a prímszám kimenet kimeneteként.
  3. 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

  1. 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őtt send kilépne a következő törvényes számból.
  2. Az fitler(2) első kimenete, amely 3, a prímszám kimenetként kerül kiküldésre.
  3. 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

  1. A megadott szám alapján a filter(3) eltávolít minden olyan számot, amely osztható 3-mal, mielőtt send a következő törvényes számból.
  2. A fitler(2) első kimenete, amely 5, a prímszám kimenetként kerül kiküldésre.
  3. 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

  1. A megadott szám alapján a filter(5) eltávolítja az 5-tel osztható számokat, mielőtt a send a következő törvényes számból kerül ki.
  2. A fitler(5) első kimenete, amely 7, a prímszám kimenetként kerül kiküldésre.
  3. 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 átfolyik filter(7)-be, kivéve a 25-öt kiszűrtük.

A szűrő(7), szűrő(11), szűrő(13) gyártó

  1. 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.
  2. 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.