kotlin - kotlin 控制台中定义的变量范围是什么?

标签 kotlin kotlinc

比如我通过kotlinc进入kotlin控制台命令。

然后定义一个变量:val pi = 3.14 ,它的范围是什么?

我试过const val PI = 3.14 ,这将是如下错误:

error: const 'val' are only allowed on top level or in objects



所以,我想知道在控制台中输入的代码范围是什么?

最佳答案

命令行REPL编译与.kts脚本编译非常相似,which result is documented here .每一行都被编译为一个单独的脚本。
kotlinc为您输入的每一行创建一个新类并创建一个 init执行您的行的 block 。如果您声明一个属性/函数/类,它将是生成类的公共(public)属性/函数/子类。

生成的类构造函数采用在它之前生成的所有类的实例(每行一个类)并将它们用作代码的接收器。

如果您在命令行编译器中使用反射,则可以对其进行验证。有一些例子可以验证我所说的:

> println(this::class)
class Line_0
> val a = 0
> println(::a.visibility)
PUBLIC
> import kotlin.reflect.full.*
> println(Line_1::class.memberProperties)
[val Line_1.a: kotlin.Int]
> println(Line_1::class.constructors)
[fun <init>(): Line_1]

您可以创建 Line_0 的实例容易地:
> println(Line_0::class.java.constructors.first().newInstance())
Line_0@5b8caf1b

但是创建其他行的实例需要传递所有先前行的实例:
> val line0 = Line_0::class.java.constructors.first().newInstance()
> println(Line_1::class.java.constructors.first().newInstance(line0))
Line_1@1baba519

此外,您可以通过创建实例来创建无限递归(如果您将以下行作为 kotlinc 中的第一行):
Line_0::class.java.constructors.first().newInstance()

关于kotlin - kotlin 控制台中定义的变量范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60220619/

相关文章:

kotlin-js - 如何将 Kotlin 文件编译为 JavaScript?

android - 如何从 Jetpack Compose TextField 关闭虚拟键盘?

java - 注解处理: how to change annotation target in Kotlin code?

java - mongodb,保存后截断日期时间中的毫秒

websocket - 如何使用okhttp3.Interceptor来捕获okhttp3 WebSocket网络事件?

Kotlin 编译器 : `nop` s in bytecode

java - Kotlin 编译器或 Java 反编译器的奇怪行为

kotlin - 在 Kotlin 注释处理期间如何访问方法体?

android - 在不停止背景音乐的情况下播放videoView