有没有可能在Kotlin中创建递归函数types?
我有代表一个过程中的步骤的函数。 每个function也知道下一步,如果有的话。 我希望能够做到这样的事情:
fun fooStep() : Step? { ... do something ... return ::barStep // the next step is barStep }
这些函数是从一个中央调度函数调用的,它的代码有点像这样:
var step = startStep while (step != null) { step = step() }
请注意,特定步骤中的逻辑也决定下一步,如果有的话。
我以为我可以定义为:
typealias Step = () -> Step?
所以一个Step
是一个返回另一个Step
的函数,或者是null。 但是,这不能编译:
Kotlin: Recursive type alias in expansion: Step
我可以通过将函数包装在一个对象中来解决这个问题。 例如:
data class StepWrapper(val step: () -> StepWrapper?)
并相应地更改我的function签名。
不幸的是,这意味着我不能只使用函数文字(例如::barStep
),而是必须将它们包装在StepWrapper
:
fun fooStep() : StepWrapper? { ... do something ... return StepWrapper(::barStep) }
(我也必须相应地改变我的调度循环。)
如果可能的话,我想避免需要创建这些包装对象。 Kotlin有没有办法做到这一点?
您可以使用一些通用接口来定义它:
interface StepW : ()->T? interface Step : StepW class Step1 : Step { override fun invoke(): Step? = Step2() } class Step2 : Step { override fun invoke(): Step? = null }
Step
是你的递归函数types。
以下是你如何使它工作,虽然我真的不知道你想用它来实现什么:
typealias Fun = () -> T typealias Step = () -> (T) typealias Step1 = Step> typealias Step2 = Step> typealias Step3 = Step fun step1(): Step1 { return { println("step 1") ::step2 } } fun step2(): Step2 { return { println("step 2") ::step3 } } fun step3(): Step3 { return { println("done") } }
使用Enum来实现具有有限状态的状态模式,并希望返回非空值。 一个枚举可以从一个函数inheritance。
enum class Step : () -> Step { Step1 { override fun invoke() = Step2 }, Step2 { override fun invoke() = End }, End { override fun invoke() = this } } fun work() { var step = Step.Step1 while (step !== Step.End) { step = step() } }