jhe*_*dus 3 specifications scala language-specifications
我正在阅读Scala语言规范,我遇到了一些令人困惑的事情,即包含值是值并且它们确实有类型的含义.
以下是我从Scala语言规范中得出的结论(可能不正确?)这个奇怪的事实:
背景:
在类型指示符部分,它写成:
SimpleType :: = StableId
类型指示符指的是命名值类型.它可以是简单的或合格的.所有这些类型指示符都是类型投影的缩写.
具体地,将非限定类型名称t(其中t绑定在某个类,对象或包 C中)作为C.this.type#t的简写.如果t没有绑定在类,对象或包中,则t被视为ε.type#t的简写.
限定类型指示符的格式为pt,其中p是路径,t是类型名称.这种类型指示符等同于类型投影p.type #t.
下面列出了一些类型标识符及其扩展.我们假设一个局部类型参数t,一个值maintable与类型成员节点和标准类scala.Int,

此外,通过考虑类型投影定义:
SimpleType :: = SimpleType'#'id
类型投影T#x引用类型为T的类型成员.
最后,单例类型定义说:
SimpleType :: = Path'.' 类型
单例类型的形式为p.type,其中p是指向期望符合scala.AnyRef的值的路径.该类型表示由null组成的值集合和由p表示的值.
推理链:
所以,我们知道:
1)scalain scala.Int是一个包.
2)scala.Int只是语法糖scala.type#Int(如类型指示符定义中所述并在上图中显示)
3)scala.type#Int是一种类型投影,其中scala.type必须是根据类型投影定义的类型,其中规定:
类型投影T#x引用类型为x的类型成员.
4)所以scala.type是一种类型!也就是说,根据单例类型的定义,它是单例类型,它表示:
单例类型的形式为p.type,其中p是指向期望符合scala.AnyRef的值的路径.
5)scala对应于符合AnyRef p的值
6)在Scala的语言规范这里它被写入的是:
Scala中的每个值都有一个类型......
7)所以包装scala有一个类型.
问题:
1)这个推理是否正确?包是否scala真的符合AnyRef的价值?如果这种推理不正确,请解释原因.
假设上述推理是正确的,并且包scala确实是一个值:
2)包装在什么意义上是scala一个价值?这怎么有意义呢?在什么情况下我们可以将其scala视为一种价值,就像我们认为的那种5:Int价值一样?5Int
3)如果包scala是一个符合AnyRef的值,那么我应该能够将该值放入变量中,我可以这样做,如果没有,那为什么不呢?
4)scala在幕后内部(由编译器)表示包的值如何?它是一个对象吗?此值是否以JVM对象的形式存在于运行时?如果是的话,我怎么能抓住它呢?我该怎么称呼toString它的方法?
基于实验而不是规范:
1)包有类型,但它们符合Any,而不是AnyRef.你不能将它们分配给types:
scala> type t = java.type
<console>:7: error: type mismatch;
found : java.type
required: AnyRef
Note that java extends Any, not AnyRef.
Such types can participate in value classes, but instances
cannot appear in singleton types or in reference comparisons.
Run Code Online (Sandbox Code Playgroud)
有趣的是,这不是对Any类型的一般限制:
scala> type q = Int
defined type alias q
Run Code Online (Sandbox Code Playgroud)
我怀疑还有其他事情发生了
2)我怀疑这个规范的唯一原因是支持package objects.如果我们写
package object foo {
val x = 5
val y = this
}
Run Code Online (Sandbox Code Playgroud)
那么说这foo不是一个价值会很奇怪(尤其奇怪的是,这y不是一个价值).如果一个普通的软件包在我们package object为它定义一个值时就会神奇地发出一个值,这也会很奇怪.
3)我看不到任何方法,因为我看不到任何方式来访问该值.该错误甚至表示包不是值:
val f = foo
test.scala:10: package foo is not a value
Run Code Online (Sandbox Code Playgroud)
foo在某种意义上,值可能是"存在",但是没有办法在源代码中命名它(除了在包对象本身之外)?
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |