我试图熟悉arrow-kt库,但是我很愚蠢地完成了最简单的事情:使用内置的类型类之一,即“ Show” 我使用@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()'的引用=(
答案 0 :(得分:3)
您缺少show.run { }
。为了使接口中定义的扩展功能正常工作,您需要使用run
或在使用它的类中对其进行扩展,以使其扩展。要么
class Gump: FumpShow
或
Fump.show().run { fump.show() }
应该给您想要的结果。
另一个选择是导入show
函数,Arrow Meta的处理器将使用@extension
为您创建。确保在您的build.gradle
kapt "io.arrow-kt:arrow-meta:$arrow_version"
然后应该像从IntelliJ的建议中导入show
一样容易。
答案 1 :(得分: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()}")
}
最诚挚的问候
亚历克斯