我有代表流程中步骤的函数。每个函数也知道下一步,如果有的话。我希望能够做类似的事情:
fun fooStep() : Step? {
... do something ...
return ::barStep // the next step is barStep
}
这些函数是从一个中央调度函数调用的,它包含的代码有点像这样:
var step = startStep
while (step != null) {
step = step()
}
请注意,特定步骤中的逻辑也决定了下一步(如果有的话)。
我以为我可以定义Step
为:
typealias Step = () -> Step?
所以 aStep
是一个返回另一个Step
或 null 的函数。但是,这无法编译:
Kotlin: Recursive type alias in expansion: Step
我可以通过将函数包装在一个对象中来解决这个问题。例如:
data class StepWrapper(val step: () -> StepWrapper?)
并相应地更改我的函数签名。
不幸的是,这意味着我不能只使用函数文字(例如:)::barStep
,而是必须将它们包装在 a 中StepWrapper
:
fun fooStep() : StepWrapper? {
... do something ...
return StepWrapper(::barStep)
}
(我还必须相应地更改我的调度循环。)
如果可能的话,我想避免创建这些包装对象。在 Kotlin 中有没有办法做到这一点?