Kotlin`with`with`具有多个参数

Kotlin`with`with`具有多个参数,kotlin,Kotlin,我真的很喜欢with的行为。是否可以使用扩展,以使其可用于多个参数 我想这样使用和 with(foo, bar){ fooFunction() barFunction() } 我认为不可能编写这样的函数,但是使用标准的with可以编写 (注意,如果一个方法在foo和bar上都可用,这样就会调用bar方法)。另一种可能性是使用对,类似于: with( Pair("abc" , listOf(1,2,3)) ) { println(first.plus("d"))

我真的很喜欢
with
的行为。是否可以使用扩展
,以使其可用于多个参数

我想这样使用

with(foo, bar){
    fooFunction()
    barFunction()
}

我认为不可能编写这样的函数,但是使用标准的
with
可以编写


(注意,如果一个方法在
foo
bar
上都可用,这样就会调用
bar
方法)。

另一种可能性是使用
对,类似于:

with( Pair("abc" , listOf(1,2,3)) ) {
    println(first.plus("d"))
    println(second.reversed())
}
印刷品:

abcd
[3,2,1]

标准的
with
功能不可能做到这一点,因为它不能有两种lambda接收器类型(通过
this
访问)

s嵌套两个
,这很糟糕。它可以引起各种各样的问题,
这个
模棱两可


也就是说,您可以使用
函数创建自己的
,该函数的工作方式与标准函数类似,但不会使用传递的扩展函数(因此此
后面没有“隐藏”接收器类型),而是使用具有两个参数的常规lambda:

inline fun <T1, T2, R> with(t1: T1, t2: T2, block: (T1, T2) -> R): R {
    return block.invoke(t1, t2)
}

//then:
with(foo, bar) { f, b ->
    f.fooFunction()
    b.barFunction()
}
inline fun with(t1:t1,t2:t2,block:(t1,t2)->R:R{
返回块调用(t1,t2)
}
//然后:
与(foo,bar){f,b->
f、 fooofunction()
b、 巴函数()
}

首先,我强烈反对

你可以接近你想要的:

data class A(val a: Int)
data class B(val b: Int)

fun<S, T> withPair(a: S, b: T, f: S.() -> T.() -> Unit) {
    val g = a.f()
    b.g()
}

fun main() {
    withPair(A(1), B(2)) {{
        print(a)
        print(b)
    }}
}
数据类A(val A:Int)
数据类B(val B:Int)
配对游戏(a:S,b:T,f:S.()->T.()->单位){
val g=a.f()
b、 g()
}
主要内容(){
带配对(A(1),B(2)){{
印刷品(a)
印刷品(b)
}}
}

所以你可以有一个块函数,它返回一个块函数。不过你需要嵌套的lambda。

是的,嵌套的效果差不多。当然,潜在的歧义是危险的:正如您所说的,使用嵌套,
bar
的成员将获得优先级,而使用组合版本,您可能会得到编译时错误。但除此之外,可能不需要新的语法。(特别是可能需要对语言进行深刻的更改才能更改名称解析。)
inline fun <T1, T2, R> with(t1: T1, t2: T2, block: (T1, T2) -> R): R {
    return block.invoke(t1, t2)
}

//then:
with(foo, bar) { f, b ->
    f.fooFunction()
    b.barFunction()
}
data class A(val a: Int)
data class B(val b: Int)

fun<S, T> withPair(a: S, b: T, f: S.() -> T.() -> Unit) {
    val g = a.f()
    b.g()
}

fun main() {
    withPair(A(1), B(2)) {{
        print(a)
        print(b)
    }}
}