我经常遇到一种情况,我在一个类型中有抽象扩展函数。
interface PetScript {
fun Pet.feed()
fun Pet.call()
}
将函数作为扩展函数可以实现非常简约的实现,因为它提供了自动this
上下文。
不幸的是,我知道使用这些函数的唯一方法是编写传递给扩展的样板标准函数。
interface PetScript {
fun Pet.feed()
fun Pet.call()
fun feed_(pet: Pet) = pet.feed()
fun call_(pet: Pet) = pet.call()
}
这样我就能使用这样的函数:
val pet = ...
val script = ...
script.feed_(pet)
script.call_(pet)
是否有更好,更惯用的方式来使用类型之外的扩展函数?
答案 0 :(得分:2)
有longstanding ticket for multiple receivers on extension functions,但简单的解决方法是嵌套范围:
val pet = ...
val script = ...
script.run {
pet.feed()
pet.call()
}