Ich habe Funktionen, die Schritte in einem Prozess darstellen. Jede Funktion kennt auch den nächsten Schritt, falls es einen gibt. Ich möchte in der Lage sein, etwas zu tun wie:Ist es möglich, in Kotlin einen rekursiven Funktionstyp zu erstellen?
fun fooStep() : Step? {
... do something ...
return ::barStep // the next step is barStep
}
Diese Funktionen von einer zentralen Dispatching-Funktion aufgerufen werden, die Code ein bisschen wie folgt enthält:
var step = startStep
while (step != null) {
step = step()
}
Beachten Sie, dass die Logik in einem bestimmten Schritt bestimmt auch den nächsten Schritt, wenn es sogar einen gibt.
Ich dachte, ich Step
wie definieren könnte: So ein Step
eine Funktion ist
typealias Step =() -> Step?
, die eine andere Step
zurückgibt, oder null. Das kompiliert jedoch nicht mit:
Kotlin: Recursive type alias in expansion: Step
Ich kann umgehen, indem Sie die Funktion in einem Objekt umschließen. zB:
data class StepWrapper(val step:() -> StepWrapper?)
und meine Funktionssignaturen entsprechend ändern.
Leider bedeutet dies, dass ich nicht nur Funktionsliteralen (zB: ::barStep
), sondern wickeln, um sie in einem StepWrapper
:
fun fooStep() : StepWrapper? {
... do something ...
return StepWrapper(::barStep)
}
(Ich habe auch meine Dispatch Schleife ändern sich entsprechend.)
Ich möchte die Notwendigkeit vermeiden, diese Wrapper-Objekte zu erstellen, wenn möglich. Gibt es eine Möglichkeit, dies in Kotlin zu tun?
https://github.com/Kotlin/KEEP/blob/master/proposals/type-aliases.md Nicht diese nach, zumindest nicht – Novaterata
eine mit der Funktion typealias Gibt es einen zwingenden Grund, dass ein Schritt muss den nächsten Schritt wissen? Ein anderer Ansatz wäre, eine Step-Funktion zu haben, die eine Condition zusammen mit einem Graphen von Step-Funktionsreferenzen zurückgibt. Jeder Knoten in dem Graphen enthält die aufzurufende Schrittfunktion und dann eine Zuordnung von dem, was als nächstes aufgerufen werden soll, abhängig von der Bedingung, die zurückgegeben wird. Es würde dann einen Executor geben, der diesen Graphen durchlaufen könnte. –
roobyroo
@roobyroo Was ist der Vorteil für den 'Map' Ansatz gegenüber dem in der Frage beschriebenen 'StepWrapper' Ansatz? –