私有顶层扩展函数和内部私有扩展函数的区别class

Difference between private top-level extension function and private extension function inside class

我们目前正在将我们的项目切换到 Kotlin,运行 解决以下问题:

我们仅在给定的 class 中需要某个 扩展函数 。因此,我们有两种可能性:(1) 在文件顶层声明扩展函数 private 或 (2) 在 class.[=21= 中声明扩展函数 private ]

正在关注 MCVE

顶级示例(文件C1.kt):

private fun String.double() = this.repeat(2)
class C1 {
    init {
        println("init".double())
    }
}

内部 class 示例(文件 C2.kt):

class C2 {
    private fun String.double() = this.repeat(2)
    init {
        println("init".double())
    }
}

问题:

  1. 这两种方法有什么区别吗,除了在 C1.kt 中扩展函数 String.double() 也对其他可能的文件成员可见(例如进一步 class在同一个文件中)?

  2. 由于我们要实现代码 "as kotlinic as possible",我们想知道建议的两种方法中的哪一种。上面的例子有官方建议/风格指南吗?我认为声明扩展函数尽可能接近其预期用途被认为是一种好的做法,因此在上面的示例中,建议使用 C2 的结构?

  1. Is there any difference to those two approaches, except that in C1.kt the extension function String.double() would also be visible to other possible file members (such as further classes in the same file)?

有一个区别:在 class 中指定扩展函数时(在您的示例 C2 中),您还可以使用 class 访问此 class 的实例qualified this 语法(在您的示例中 this@C2)。

  1. Since we want to achieve code "as kotlinic as possible", we would like to know which of the two approaches is the suggested one. Is there an official suggestion / style guide on the example above? I think it is considered good practice to declare extension functions as close as possible to its intended use, thus in the above example the structure of C2 would be suggested?

这是个好问题。就个人而言,我会将扩展函数放在 class 之外,因为它们(通常)指定与 extended 类型相关的行为,而不是 [=27] 的类型=] 使用它们的地方。但是,如果您 do 需要扩展函数中的 class 相关信息,我会在 class.

中指定它们