在多个接收器上调用一种通用方法



通常,我有以下模式:

a.x()
a.y()
a.z()

kotlin提供了方便的替代方案:

a.run { x(); y(); z() }

有时我有这样的模式:

a.x()
b.x()
c.x()

我想写这样的东西:

applyTo(a, b, c) { it.x() }

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

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

或其他类似的东西:

::x.eachOf(a, b, c)

所以我可以实现该功能:

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

是否有一种方法可以使用标准库在多个接收器上调用共享方法,或者有更好的方法缩短模式#2?

只需使用列表:

listOf(a, b, c).forEach { it.x() }

我假设您的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() }

您的第二个解决方案很有趣,但不是很可读的恕我直言。不会那样做。

相关内容

最新更新