我正在阅读 Scala 语言规范,我遇到了一些令人困惑的事情,即包是值并且它们确实具有类型的含义。
以下是我从 Scala 语言规范中得出的结论(可能是错误的?)这个奇怪的事实:
背景:
在类型指示符部分,它是这样写的:
SimpleType ::= StableId
类型指示符是指命名值类型。它可以是简单的或合格的。所有这些类型指示符都是类型投影的简写。
具体来说,将 t 绑定在某个类、对象或包 C中的非限定类型名称 t被视为C.this.type#t 的简写。如果 t 未绑定在类、对象或包中,则 t 被视为 ε.type#t 的简写。
限定类型指示符具有 pt 形式,其中 p 是路径,t 是类型名称。这样的类型指示符等价于类型投影 p.type#t。
下面列出了一些类型指示符及其扩展。我们假设一个本地类型参数 t,一个带有类型成员 Node 和标准类 scala.Int的值maintable,
此外,通过考虑类型投影定义:
SimpleType ::= SimpleType '#' id
类型投影T#x 引用类型 T 的名为 x 的类型成员。
最后,单例类型定义说:
SimpleType ::= 路径 '.' 类型
单例类型的形式为 p.type,其中 p 是指向预期符合 scala.AnyRef 的值的路径。类型表示由 null 和 p 表示的值组成的值的集合。
推理链:
所以,我们知道:
1) scala
inscala.Int
是一个包。
2)scala.Int
只是语法糖scala.type#Int
(如类型指示符定义中所述,如上图所示)
3)scala.type#Int
是类型投影,其中scala.type
必须是根据类型投影定义的类型,其中规定:
类型投影 T#x 引用类型 T 的名为 x 的类型成员。
4)scala.type
类型也是如此!也就是说,它是一个单例类型,根据单例类型的定义,它说:
单例类型的形式为 p.type,其中 p 是指向预期符合 scala.AnyRef 的值的路径。
5)scala
对应p
哪个是符合AnyRef的值
6)在这里的Scala语言规范中写道:
Scala 中的每个值都有一个类型...
7)所以包scala
有一个类型。
问题:
1)这个推理正确吗?包scala
真的是符合 AnyRef 的值吗?如果这个推理不正确,请解释原因。
假设上面的推理是正确的并且包scala
确实是一个值:
2) 包裹在什么意义上是scala
有价值的?这有什么意义呢?在什么情况下,我们可以将值视为与类型scala
相同5:Int
的值?5
Int
3)如果包scala
是符合AnyRef的值,那么我应该能够将该值放入变量中,我可以这样做,如果不是,那为什么不呢?
4) 包的价值是如何scala
在幕后内部(由编译器)表示的?它是一个对象吗?这个值在运行时是否以 JVM 对象的形式存在?如果是,我怎样才能得到它?我怎样才能调用toString
它的方法?