Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin DSL-具有多个接收器的通用lambda_Kotlin_Dsl - Fatal编程技术网

Kotlin DSL-具有多个接收器的通用lambda

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)

我正在为我的项目创建一个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)
        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
。你可能真的想要,但这并不意味着你需要可以