私有顶层扩展函数与类内部私有扩展函数的区别

Mar*_*ger 6 extension-methods member kotlin extension-function toplevel

我们目前正在将我们的项目切换到 Kotlin,并遇到以下问题:

我们只需要在给定的类中使用某个扩展函数。因此,我们有两种可能性:(1)private在文件顶层声明扩展函数或(2)private在类内部声明扩展函数。

遵循MCVE

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

private fun String.double() = this.repeat(2)
class C1 {
    init {
        println("init".double())
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class C2 {
    private fun String.double() = this.repeat(2)
    init {
        println("init".double())
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 这两种方法有什么区别,只是在C1.kt扩展函数String.double()中其他可能的文件成员(例如同一文件中的其他类)也可以看到?

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

And*_*mer 6

  1. 这两种方法有什么区别,只是在C1.kt扩展函数String.double()中其他可能的文件成员(例如同一文件中的其他类)也可以看到?

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

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

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