GOOGLE ADS

Mittwoch, 20. April 2022

Wie erstelle ich eine Erweiterungsfunktion mit mehreren Empfängern in Kotlin?

Ich möchte, dass meine Nebenstellenfunktion mehrere Empfänger hat. Zum Beispiel möchte ich, dass die Funktion Methoden von beiden und Instanzen handleaufrufen kann:CoroutineScopeIterable

fun handle() {
// I want to call CoroutineScope.launch() and Iterable.map() functions here
map {
launch { /*... */ }
}
}

Ich dachte, das könnte funktionieren:

fun <T> (Iterable<T>, CoroutineScope).handle() {}

Aber es gibt mir einen Fehler:

Function declaration must have a name

Ich weiß, dass ich die Funktion mit Parametern erstellen kann, aber

Ist es möglich, mehrere Empfänger für eine einzelne Funktion zu haben und wie geht das ohne Parameter?


Lösung des Problems

In der Kotlin-Version 1.6.20 gibt es ein neues Feature namens Context receivers. Dies ist ein erster Prototyp von Kontextempfängern. Dieses Feature ermöglicht es, Funktionen, Eigenschaften und Klassen kontextabhängig zu machen, indem Kontextempfänger zu ihrer Deklaration hinzugefügt werden. Dafür gibt es eine neue Syntax. Vor der Funktionsdeklaration können wir eine Liste kontextabhängiger Typen angeben, die zum Aufrufen dieser Funktion erforderlich wären. Eine kontextbezogene Deklaration bewirkt Folgendes:


  • Es erfordert, dass alle deklarierten Kontextempfänger im Gültigkeitsbereich eines Aufrufers als implizite Empfänger vorhanden sind.

  • Es bringt deklarierte Kontextempfänger in den Körperumfang von impliziten Empfängern.


Die Lösung mit Kontextempfängern sieht wie folgt aus:

context(CoroutineScope)
fun <T> Iterable<T>.handle() {
map {
launch { /*... */ }
}
}
someCoroutineScope.launch {
val students = listOf(...)
students.handle()
}

In context(CoroutineScope)können wir mehrere Typen deklarieren, zB context(CoroutineScope, LogInterface).

Da es sich bei der Kontextempfängerfunktion um einen Prototyp handelt, fügen Sie die -Xcontext-receiversCompiler-Option in der App- build.gradleDatei hinzu, um sie zu aktivieren:

apply plugin: 'kotlin-android'
android {
//...
kotlinOptions {
jvmTarget = "11"
freeCompilerArgs += [
"-Xcontext-receivers"
]
}
}

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...