kotlin - kotlin 控制台中定义的变量范围是什么?
问题描述
kotlinc
比如我通过命令进入kotlin控制台。
然后定义一个变量:val pi = 3.14
,它的作用域是什么?
我试过const val PI = 3.14
了,这将是一个错误,如下所示:
错误:const 'val' 只允许在顶层或对象中
所以,我想知道在控制台中输入的代码范围是什么?
解决方案
命令行 REPL 编译与 .kts 脚本编译非常相似,其结果记录在此处。每一行都被编译为一个单独的脚本。
kotlinc
为您输入的每一行创建一个新类,并创建一个init
执行您的行的块。如果您声明一个属性/函数/类,它将是生成类的公共属性/函数/子类。
生成的类构造函数采用在它之前生成的所有类的实例(每行一个类)并将它们用作代码的接收器。
如果您在命令行编译器中使用反射,则可以对其进行验证。有一些例子可以验证我所说的:
> 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()
推荐阅读
- android - 如何在调用其显示方法之前调整对话框的大小?
- php - 删除数组中所有复制的值,只保留唯一的键/值对
- dependency-injection - ASP.NET 核心。使用 Type 参数配置 IOptions 方法(非通用)
- scala - 如何将 Scala Spark Dataframe 转换为 LinkedHashMap[String, String]
- python - Python - 评估条件语句的每个条件
- excel - VBA - 如何从连接中清除连接字符串
- node.js - 使用 Google Cloud KMS 进行 Firebase 实时数据库加密的最佳做法
- c++11 - 有没有办法在模板参数列表中使用 type_traits 来改变类型?
- html - 具有页眉和页脚的外部容器的视差滚动
- asp.net-mvc - 返回与父文件夹和子文件夹中的参数文件名匹配的 MVC 视图