Kotlin:如何在外部访问类型中的扩展功能?

时间:2017-03-23 15:07:31

标签: function extension-methods kotlin

我经常遇到一种情况,我在一个类型中有抽象扩展函数。

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)

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

1 个答案:

答案 0 :(得分:2)

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

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

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