我正在试着熟悉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()‘的引用缺少=(
发布于 2019-07-23 05:58:59
你要错过show.run { }了。要使在接口中定义的扩展函数工作,您需要在它们的作用域内,使用run或在使用它的地方创建一个类来扩展它。任一
class Gump: FumpShow或
Fump.show().run { fump.show() }应该会给你想要的结果。
另一种选择是使用@extension导入Arrow Meta处理器为您创建的show函数。确保在您的build.gradle中正确配置了它
kapt "io.arrow-kt:arrow-meta:$arrow_version"然后,它应该像从IntelliJ的建议中导入show一样简单。
发布于 2019-07-23 06:18:16
非常感谢你,El Paco!
但我必须承认这对我来说有点违反直觉。=/
现在我用这种方法结束了:
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()}")
}诚挚的问候
亚历克斯
https://stackoverflow.com/questions/57153396
复制相似问题