Kotlin 允许在函数中定义数据 class,为什么?

Kotlin allows defining data class in a function, why?

在 kotlin 中,这是合法的:


fun f1(): Int {
    data class Data(val i: Int)

    val d = Data(0)

    return d.i
}

我想知道在函数中声明数据 class 的后果是什么。我最好的猜测是数据 class 是函数的范围,但我在文档中没有找到任何提及的内容。

这叫做本地类documentation 中提到了它们,但只是说它们不能具有可见性修饰符。

  • 您不能访问本地 class 在其中声明的函数之外的任何地方。
  • 它可以访问包含 class 的任何成员,包括私有成员。
  • 它可以访问声明函数范围内的任何局部变量或方法参数

您可以查看 Java's local classes 了解更多信息。应该基本一样。

一个典型的用例是 throw-away 实现某个接口。

fun main() {
    val f1 = f1()

    println(f1.x)
    println(f1.y)
}

interface Data {
    val x : Int
    val y : Int
}

fun f1(): Data {
    data class SpecificData(override val x: Int, override val y: Int) : Data

    return SpecificData(5, 10)
}