annotations - Kotlin 注释处理 : is it possible to generate an extension method?

标签 annotations kotlin

我正在玩 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 对其进行处理使用所需代码的方法?

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

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

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

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

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)
}

最佳答案

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

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

然后定义一个辅助函数来将扩展函数绑定(bind)到接收器:
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))
}

关于annotations - Kotlin 注释处理 : is it possible to generate an extension method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214405/

相关文章:

kotlin - 错误 ----> 任务 :expo-permissions:compileDebugKotlin FAILED

android - 在 kotlin 中,如何创建个人资料图像并在离线短信应用程序中将联系人姓名的第一个字母显示为个人资料图像?

android - Kotlin 高阶函数传递一个参数数量可变的函数作为参数

android - 这段代码会导致 kotlin 内存泄漏吗

java - 如果 Spring 配置文件与指定的配置文件不同,如何使用注释 @Profile 跳过服务类

ios MapKit 的注释描述在启动时可见,但在点击时不可见

matlab - 如何在Matlab中为semilogx添加注释?

spring - @Value 在 Spring/Jersey 应用程序中返回 Null

带有@MappedSuperclass 的 hibernate TABLE_PER_CLASS 不会创建 UNION 查询

android - Kotlin:带实时数据的协程还是只有协程?