Kotlin注释处理:是否可以生成扩展方法?

时间:2015-07-03 21:32:01

标签: 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方法进行处理?

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

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

节点:我理解功能类的概念几乎没有用例,并且手动添加提到的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)
}

1 个答案:

答案 0 :(得分:3)

不确定,如果你想要的东西可以直接完成,不过这里的方法没有“功能类”。据我所知,您希望为常规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))
}