首页 > 解决方案 > 如何使用箭头的类型类?

问题描述

我正在尝试熟悉 arrow-kt 库,但为了完成最简单的事情,我很笨:使用内置类型类之一,即“显示”,我使用 @extension 注释使用 kapt 尝试了它并且 kapt 本身正在按预期生成必要的代码,但是缺少对扩展函数“show():String”的引用。有人可以帮我解决这个问题吗?我浪费了两天时间让这个工作。

非常感谢!

此致

亚历克斯

要扩展的类:

package org.hudelundpfusch.sqwakkel.arrowtest

import arrow.extension
import arrow.typeclasses.Show

class Fump(private val fumpel: String) {

    companion object {}

    override fun toString(): String {
        return "Fump(fumpel='$fumpel')"
    }

}

@extension
interface FumpShow
    : Show<Fump> {
    override fun Fump.show(): String = toString()
}

这里我想使用扩展功能:

package org.hudelundpfusch.sqwakkel.arrowtest

class Gump {

    private val fump: Fump = Fump("Fumpel!")

    fun gumpel(): String = fump.show()

}

但是缺少对“fump.show()”的引用 =(

标签: kotlinarrow-kt

解决方案


你不见了show.run { }。为了使接口中定义的扩展函数起作用,您需要在它们的范围内,使用run或制作一个您正在使用它的类来扩展它。任何一个

class Gump: FumpShow

或者

Fump.show().run { fump.show() }

应该给你你想要的结果。

另一种选择是导入showArrow Meta 处理器将为您创建的函数,使用@extension. 确保在您的build.gradle

kapt "io.arrow-kt:arrow-meta:$arrow_version"

然后它应该像show从 IntelliJ 的建议中导入一样简单。


推荐阅读