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()
}
我经常遇到在一个类型中有抽象扩展函数的场景。
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()
}