当前位置: 首页 > 知识库问答 >
问题:

具有高阶函数的静态编程语言契约

许俊风
2023-03-14

我有静态编程语言为空的问题,我想知道我是否能够解决它与合同

fun <T, R> Action<T>.map(mapper:(R)->T): Action<R> {
   return Action{ execute(mapper(it)) }
}

fun <T> Action<T>.ifNotNull(): Action<T> {
  return Action { if(it != null) execute(it) }
} 

还有一个具有可为空数据的通用模型:

class Model<T>(val data: T?)

现在我创建了一个函数,它以Action接口作为参数。案例是仅当param!=空,因此如下所示:

fun <T> callback(model: Model<T>, action: Action<T>){
    action
    .map{ it.getData() } //compilation error: getData return T? when action require T
    .ifNotNull() //execute only when data!=null
    .execute(model)
}

那么现在,有没有任何选项可以使用Kotlin契约来确保编译器不使用null参数执行操作

共有3个答案

梅飞龙
2023-03-14

我创建了专门用于此用途的操作接口实现,如下所示:

class ModelAction<T>(val action: Action<T>) : Action<T?> {
    override fun execute(param: T?) {
        param?.let {
            action.execute(it)
        }
    }
}

fun callback<T>(model: Model<T>, action: Action<T>){
    ModelAction(action)
    .map{ it.getData() } 
    .execute(model)
}

这个想法可能会帮助有类似问题的人,但它不符合我的期望,我仍然依赖于基于高阶函数的解决方案。

百里京
2023-03-14

默认情况下,如果未绑定,则所有类型参数都可以为null(换句话说,它们是从Any?派生的)。解决这个问题的简单方法就是在类型参数上指定非空绑定:

索和璧
2023-03-14

ModelAction在您自己的答案中,只需为ifNotNull()提供正确的签名:

fun <T> Action<T>.ifNotNull(): Action<T?> {
    return Action { if(it != null) execute(it) }
} 

那么你的操作顺序就错了:

fun <T> callback(model: Model<T>, action: Action<T>){
    action
    .ifNotNull() // Action<T?>
    .map { model: Model<T> -> model.data } // Action<Model<T>>
    .execute(model)
}

请注意,编译器将无法推断此map用法的R。你也可以把它写成

fun <T> modelAction(action: Action<T>): Action<Model<T>> {
    return action
    .ifNotNull()
    .map { it.data }
}

顺便说一下,这个参数是map的错误方法;这样的函数通常被称为矛盾图

 类似资料:
  • 我有静态函数,它仅限于一些上下文(例如仅用于文档)。有两种替代方法可以将其定义为顶层函数或对象中的函数。 1. 2. 顶级函数的优点是它没有被包装在一个对象中,缺点是它可以从任何地方访问,没有类名前缀。这种情况有优点还是缺点或最佳实践?

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 在函数式编程中,我们可以将函数当作变量一样自由使用。一个函数接收另一个函数作为参数,这种函数称之为高阶函数(Higher-order Functions)。 看一个简单的例子: def func(g, arr): return [g(x) for x in arr] 上面的代码中,func 是一个高阶函数,它接收两个参数,第 1 个参数是函数,第 2 个参数是数组,func 的功能是将函数

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 我想为我的游戏创建一个简单的倒计时,当游戏开始时,我想每秒调用这个函数: 我试过这个: 但应用程序不幸停止,第二次调用run函数 3周前,我刚刚开始使用android开发和静态编程语言,到目前为止,我对它了解最多。 在Xcode中使用swift时,我使用了这一行,我认为类似的东西也适用于Kotlin

  • 有可能从Java代码中访问扩展函数吗? 我在静态编程语言文件中定义了扩展函数。 其中MyModel是(生成的)java类。现在,我想在我的普通java代码中访问它: 然而,那是行不通的。IDE无法识别bar()方法,编译失败。 work使用kotlin的静态函数: 通过使用导入com.test.extensions.ExtensionsPackage我的IDE似乎配置正确。 我从kotlin文档中