Kotlin Annotation Processing:是否可以生成扩展方法?
Kotlin Annotation Processing: is it possible to generate an extension method?
我正在玩 Kotlin,我认为拥有“功能性 classes”会很棒,请参阅我想要的示例:
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 将是:
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)
}
但是在每个“功能class”中手写这个有点乏味。
所以这是我的问题:是否可以制作 functional
注释,然后使用所需代码添加 invoke
方法对其进行处理?
我知道 kapt 可以用于 Kotlin 注释处理,但是据我所知目前它不能生成 Kotlin 代码并且没有办法在 Java 生成的代码。
有什么方法可以为 class 生成新的 Kotlin 方法吗?
Node:我知道函数式 classes 的想法用例很少,手动添加提到的 invoke
方法并不难,但对我来说这是学术界对 Kotlin 注释处理概念的兴趣。
UPD:只是我对函数 classes 的想法:有委托接口的语言特性,它在这里工作得很好,但 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)
}
不确定,如果您想要的可以直接完成,但是这里有一个没有 "functional classes" 的方法。据我了解,您想向常规 lambda 函数添加功能。首先,将 功能 定义为常规 class:
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))
}
我正在玩 Kotlin,我认为拥有“功能性 classes”会很棒,请参阅我想要的示例:
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 将是:
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)
}
但是在每个“功能class”中手写这个有点乏味。
所以这是我的问题:是否可以制作 functional
注释,然后使用所需代码添加 invoke
方法对其进行处理?
我知道 kapt 可以用于 Kotlin 注释处理,但是据我所知目前它不能生成 Kotlin 代码并且没有办法在 Java 生成的代码。
有什么方法可以为 class 生成新的 Kotlin 方法吗?
Node:我知道函数式 classes 的想法用例很少,手动添加提到的 invoke
方法并不难,但对我来说这是学术界对 Kotlin 注释处理概念的兴趣。
UPD:只是我对函数 classes 的想法:有委托接口的语言特性,它在这里工作得很好,但 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)
}
不确定,如果您想要的可以直接完成,但是这里有一个没有 "functional classes" 的方法。据我了解,您想向常规 lambda 函数添加功能。首先,将 功能 定义为常规 class:
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))
}