0

我正在尝试熟悉 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()”的引用 =(

4

2 回答 2

3

你不见了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 的建议中导入一样简单。

于 2019-07-22T21:58:59.457 回答
0

非常感谢你,埃尔帕科!

但我不得不承认这对我来说有点违反直觉...... =/

我现在结束了这种方法:

package org.hudelundpfusch.sqwakkel.arrowtest

import org.hudelundpfusch.sqwakkel.arrowtest.fump.show.show

object FumpShowInstance : FumpShow

class Gump {

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

    fun gumpel(): String = FumpShowInstance.run { fump.show() }

}

fun main(args: Array<String>) {
    val gump: Gump = Gump();
    println("${gump.gumpel()}")
}

此致

亚历克斯

于 2019-07-22T22:18:15.943 回答