【问题标题】:Call extension function nested inside an object, from outside that object从对象外部调用嵌套在对象内部的扩展函数
【发布时间】:2019-12-16 11:43:41
【问题描述】:

如何从对象外部调用嵌套在对象内部的扩展函数?

这是一个例子:

package test

object Example {
    fun String.exampleExtension() {
    }
}

fun test(str: String) {
    str.exampleExtension() // Doesn't work. How can I use that extension function?
}

据我所知这是不可能的,但我不确定,所以我想我会问。

【问题讨论】:

  • 除非扩展依赖于存储在您的(单例)示例对象中的全局状态,否则它没有理由不应该是顶级函数。没有必要在 Example 中嵌套它。
  • 我明白你为什么会这么想,但是我遇到了其他有用的用例。即,当使用像github.com/ScottPierce/kotlin-html 这样的无状态 DSL,并且您想将 DSL 使用拆分为可重用的函数时,我发现这样的方法是必要的,否则我最终会遇到私有函数的命名冲突。

标签: kotlin extension-methods


【解决方案1】:

有两种方法可以做到这一点。

最简单的是:

fun test(str: String) {
    with (Example) {
        str.exampleExtension()
    }
}

您可以做的另一件事是手动导入扩展功能。从 Kotlin 1.3.41 开始,编译器不通过代码完成提供此功能,您必须手动请求它。

import test.Example.exampleExtension

fun test(str: String) {
    str.exampleExtension() // Works now because of the import
}

我创建了一个 Kotlin 错误来尝试修复此问题,并让自动完成功能将此建议作为导入:https://youtrack.jetbrains.com/issue/KT-33221

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2010-10-27
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多