【问题标题】:Kotlin Annotation Processing: is it possible to generate an extension method?Kotlin 注释处理:是否可以生成扩展方法?
【发布时间】:2015-07-03 21:32:01
【问题描述】:

我正在玩 Kotlin,我认为拥有“功能类”会很棒,请参阅我想要的示例:

functional class MyStrFunction(val function: MyStrFunction.(String) -> String) {
    val memory = HashMap<String, String>()
    fun output(message: String) = println(message)
}

我的想法是我可以像这样使用它:

val f = MyStrFunction { 
    output("reversing $it"); 
    if (it in memory)
        output(memory[it])
    return it.reverse() 
}

如果我自己写我想要的MyStrFunction,结果类将是:

class MyStrFunction(val function: MyStrFunction.(String) -> String) {
    val memory = HashMap<String, String>()
    fun output(message: String) = println(message)

    public fun invoke(s: String) = this.function(s)
}

但是在每个“功能类”中手动编写这个有点乏味。

所以这是我的问题:是否可以将 functional 设为注释,然后使用所需代码添加 invoke 方法对其进行处理?

我知道 kapt 可用于 Kotlin 注释处理,但 AFAIK 目前无法生成 Kotlin 代码,也无法在 Java 生成的代码中制作扩展函数。

有没有办法为类生成新的 Kotlin 方法?

Node:我知道函数类的想法很少用例,手动添加提到的invoke 方法并不难,但对我来说,Kotlin 中的注释处理概念是学术兴趣.

UPD:只是我对函数类的想法:委托接口的语言特性在这里会很好用,但 this 引用在该块中不可见。示例:

class MyStrFunction(val function: MyStrFunction.(String) -> String)
: (String) -> String by { this.function(it) } { // <-- won't compile :(
    val memory = HashMap<String, String>()
    fun output(message: String) = println(message)
}

【问题讨论】:

  • 您可以搜索或添加问题到YouTrack 询问KAPT 生成Kotlin 的功能。这样您就可以跟踪该功能的进度。

标签: annotations kotlin


【解决方案1】:

不确定,如果您想要的可以直接完成,但是这是一种没有“功能类”的方法。据我了解,您想向常规 lambda 函数添​​加功能。首先,将您的功能定义为常规类:

class Memory() {
    val memory = hashMapOf<String, String>()
    fun output(message: String) = println(message)
}

然后定义一个辅助函数来将扩展函数绑定到接收器:

fun <T, R, E> T.bind(function: T.(R) -> E): (R) -> E = { this.function(it) }

然后像这样使用它

fun main(args: Array<String>) {
    val mem = Memory()

    val memoryFunction: Memory.(String) -> String = {
        output("reversing $it");
        if (it in memory)
            output(memory[it])
        it.reverse()
    }

    val function: (String) -> String = mem.bind(memoryFunction)

    println(listOf("foo", "bar").map(function))
}

【讨论】:

  • 谢谢,您建议的方法看起来很适合这种情况。但我仍然希望在类使用中没有多余和重复的代码,并且如果可能的话,甚至在类中没有额外的代码。
猜你喜欢
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多