在多个接收器上调用常用方法

bre*_*dan 3 kotlin

通常,我有以下模式:

a.x()
a.y()
a.z()
Run Code Online (Sandbox Code Playgroud)

Kotlin提供了一个方便的替代方案:

a.run { x(); y(); z() }
Run Code Online (Sandbox Code Playgroud)

有时我有这样的模式:

a.x()
b.x()
c.x()
Run Code Online (Sandbox Code Playgroud)

我想写这样的东西:

applyTo(a, b, c) { it.x() }
Run Code Online (Sandbox Code Playgroud)

所以我可能会实现以下内容:

fun <P> applyTo(vararg ps: P, fx: (P) -> Unit) = ps.forEach { fx(it) }
Run Code Online (Sandbox Code Playgroud)

或者,或者像这样:

::x.eachOf(a, b, c)
Run Code Online (Sandbox Code Playgroud)

所以我可以实现这个功能:

fun <P, R> ((P) -> R).eachOf(vararg p: P) = p.forEach { this(it) }
Run Code Online (Sandbox Code Playgroud)

有没有办法使用标准库在多个接收器上调用共享方法,或者更好地缩短模式#2?

s1m*_*nw1 5

我假设你a,b,c的类型相同.您可以修改您applyTo接受带接收器lambda并使调用看起来像run:

fun <P> applyTo(vararg ps: P, fx: P.() -> Unit) = ps.forEach { it.fx() }
//call without it.x()
applyTo(a, b, c) { x() }
Run Code Online (Sandbox Code Playgroud)

你的第二个解决方案很有趣,但不是很可读.不会这样做.