Kotlin 在多个接收器上调用公共方法
通常,我有以下模式:Kotlin 在多个接收器上调用公共方法,kotlin,Kotlin,通常,我有以下模式: a.x() a.y() a.z() Kotlin提供了一个方便的替代方案: a.run { x(); y(); z() } 有时我有这样一种模式: a.x() b.x() c.x() applyTo(a, b, c) { it.x() } ::x.eachOf(a, b, c) 我想写这样的东西: a.x() b.x() c.x() applyTo(a, b, c) { it.x() } ::x.eachOf(a, b, c) 因此,我可以实现以下功能: f
a.x()
a.y()
a.z()
Kotlin提供了一个方便的替代方案:
a.run { x(); y(); z() }
有时我有这样一种模式:
a.x()
b.x()
c.x()
applyTo(a, b, c) { it.x() }
::x.eachOf(a, b, c)
我想写这样的东西:
a.x()
b.x()
c.x()
applyTo(a, b, c) { it.x() }
::x.eachOf(a, b, c)
因此,我可以实现以下功能:
fun <P> applyTo(vararg ps: P, fx: (P) -> Unit) = ps.forEach { fx(it) }
因此,我可以实现以下功能:
fun <P, R> ((P) -> R).eachOf(vararg p: P) = p.forEach { this(it) }
fun((P)->R).eachOf(vararg P:P)=P.forEach{this(it)}
有没有一种方法可以使用标准库在多个接收器上调用共享方法,或者有更好的方法来缩短模式#2?只需使用一个列表:
listOf(a, b, c).forEach { it.x() }
我想你的
a,b,c
是同一类型的。您可以将应用程序修改为
以接受,并使调用看起来像在运行中一样:
fun <P> applyTo(vararg ps: P, fx: P.() -> Unit) = ps.forEach { it.fx() }
//call without it.x()
applyTo(a, b, c) { x() }
funapplyTo(vararg ps:P,fx:P.()->Unit)=ps.forEach{it.fx()}
//没有它的调用。x()
应用于(a,b,c){x()}
您的第二个解决方案很有趣,但不太可读。不会这样做。a、b、c是相同的类型吗?是的,或者至少它们共享一个接口。listOf
是我的第一个猜测,可能是最好的一个。我希望Kotlin有集合文字。所有这些额外的仪式只是为了避免额外的六个角色。谢谢所有这些额外的仪式只是为了避免额外的六个字符
当我看到一种带有集合文字的语言时,我就是这么想的:)它们来了(集合文字)。。。1.2为注释中的数组介绍了它们,并做了一些幕后工作,为一般介绍做准备。