Ich möchte, dass meine Nebenstellenfunktion mehrere Empfänger hat. Zum Beispiel möchte ich, dass die Funktion Methoden von beiden und Instanzen handle
aufrufen kann:CoroutineScope
Iterable
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-receivers
Compiler-Option in der App- build.gradle
Datei hinzu, um sie zu aktivieren:
apply plugin: 'kotlin-android'
android {
//...
kotlinOptions {
jvmTarget = "11"
freeCompilerArgs += [
"-Xcontext-receivers"
]
}
}
Keine Kommentare:
Kommentar veröffentlichen