Kotlin:如何从外部访问类型中的扩展函数?

Kotlin: How can extension functions within a type be accessed externally?

我经常遇到在一个类型中有抽象扩展函数的场景。

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)

是否有更好、更惯用的方式在类型之外使用扩展函数?

有一个 longstanding ticket for multiple receivers on extension functions,但简单的解决方法是嵌套您的范围:

val pet = ...
val script = ...

script.run {
    pet.feed()
    pet.call()
}