Kotlin DSL-具有多个接收器的通用lambda
我正在为我的项目创建一个DSL,我真的希望能够使用来自多个接收器的字段/方法,而无需嵌套它们: 例如:Kotlin DSL-具有多个接收器的通用lambda,kotlin,dsl,Kotlin,Dsl,我正在为我的项目创建一个DSL,我真的希望能够使用来自多个接收器的字段/方法,而无需嵌套它们: 例如: class Foo { val fooField = "Foo field" } class Bar { val barField = "Bar field" } fun main() { val foo = Foo() val bar = Bar() (foo..bar) { println(fooField)
class Foo {
val fooField = "Foo field"
}
class Bar {
val barField = "Bar field"
}
fun main() {
val foo = Foo()
val bar = Bar()
(foo..bar) {
println(fooField)
println(barField)
}
}
而不是:
class Foo {
val fooField = "Foo field"
operator fun invoke(block: Foo.() -> Unit) {
block(this)
}
}
class Bar {
val barField = "Bar field"
operator fun invoke(block: Bar.() -> Unit) {
block(this)
}
}
fun main() {
val foo = Foo()
val bar = Bar()
foo {
bar {
println(fooField)
println(barField)
}
}
}
我曾经想过这样的事情:
class Buzz<T1, T2>(
val t1: T1,
val t2: T2
) {
operator fun invoke(function: /* T1 + T2*/ () -> Unit) { // <--- ???
function(/* t1 + t2*/)
}
}
operator fun <T, R> T.rangeTo(r: R): Buzz<T, R> {
return Buzz(this, r)
}
class嗡嗡声(
val t1:t1,
val t2:t2
) {
运算符fun invoke(函数:/*T1+T2*/()->Unit){/您不能这么做,因为单个变量不能同时保存两个对象的引用
但类似的解决方案可能是使用一对,它可以将*与您的问题联系起来:
val foo=foo()
val bar=bar()
Pair(foo,bar)。应用{//this:Pair
println(first.fooField)
println(第二个barField)
}
注意*:这只是一个建议,因为它确实通过嵌套lambda删除了样板文件
,但在另一方面,它并没有为带有多个接收器的lambda提供解决方案
这将如何工作?你不能有一个指向两个接收器的This
。你可能真的想要,但这并不意味着你需要可以