gpt4 book ai didi

kotlin - 是否可以在 Kotlin 中创建递归函数类型?

转载 作者:IT老高 更新时间:2023-10-28 13:46:03 25 4
gpt4 key购买 nike

我有代表流程中步骤的函数。每个函数也知道下一步,如果有的话。我希望能够做类似的事情:

fun fooStep() : Step? {
... do something ...
return ::barStep // the next step is barStep
}

这些函数是从一个中央调度函数调用的,其中包含的代码有点像这样:

var step = startStep
while (step != null) {
step = step()
}

请注意,特定步骤中的逻辑也决定了下一步,如果有的话。

我想我可以将 Step 定义为:

typealias Step = () -> Step?

所以 Step 是一个返回另一个 Step 或 null 的函数。但是,这无法编译:

Kotlin: Recursive type alias in expansion: Step

我可以通过将函数包装在一个对象中来解决这个问题。例如:

data class StepWrapper(val step: () -> StepWrapper?)

并相应地更改我的函数签名。

不幸的是,这意味着我不能只使用函数文字(例如:::barStep),而是必须将它们包装在 StepWrapper 中:

fun fooStep() : StepWrapper? {
... do something ...
return StepWrapper(::barStep)
}

(我还必须相应地更改调度循环。)

如果可能的话,我想避免创建这些包装对象。在 Kotlin 中有没有办法做到这一点?

最佳答案

您可以使用一些通用接口(interface)来定义它:

interface StepW<out T> : ()->T?

interface Step : StepW<Step>


class Step1 : Step {
override fun invoke(): Step? = Step2()
}

class Step2 : Step {
override fun invoke(): Step? = null
}

Step 是你的递归函数类型。

关于kotlin - 是否可以在 Kotlin 中创建递归函数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44466716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com