kotlin控制台中定义的变量范围是什么?
What is the scope of variable defined in kotlin console?
比如我通过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
为您输入的每一行创建一个新的 class 并创建一个执行您的行的 init
块。如果你声明一个property/function/class,它将是一个public property/function/subclass of generated class.
生成的 class 构造函数采用在它之前生成的所有 classes 的实例(每行一个 class)并将它们用作代码的接收者。
如果您在命令行编译器中使用反射,则可以验证。有一些例子可以验证我说的:
> 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()
比如我通过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
为您输入的每一行创建一个新的 class 并创建一个执行您的行的 init
块。如果你声明一个property/function/class,它将是一个public property/function/subclass of generated class.
生成的 class 构造函数采用在它之前生成的所有 classes 的实例(每行一个 class)并将它们用作代码的接收者。
如果您在命令行编译器中使用反射,则可以验证。有一些例子可以验证我说的:
> 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()