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)
}}
}