通常,我有以下模式:
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的更好方法?
答案 0 :(得分:5)
我认为您的a,b,c
属于同一类型。您可以修改applyTo
以接受lambda with receiver,并使通话看起来像run
:
fun <P> applyTo(vararg ps: P, fx: P.() -> Unit) = ps.forEach { it.fx() }
//call without it.x()
applyTo(a, b, c) { x() }
你的第二个解决方案很有趣,但不是很可读。不会这样做。
答案 1 :(得分:4)
只需使用清单:
listOf(a, b, c).forEach { it.x() }