3

我正在阅读 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) scalainscala.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的值?5Int

3)如果包scala是符合AnyRef的值,那么我应该能够将该值放入变量中,我可以这样做,如果不是,那为什么不呢?

4) 包的价值是如何scala在幕后内部(由编译器)表示的?它是一个对象吗?这个值在运行时是否以 JVM 对象的形式存在?如果是,我怎样才能得到它?我怎样才能调用toString它的方法?

4

1 回答 1

5

基于实验而非规范:

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.

有趣的是,这不是对Any类型的一般限制:

scala> type q = Int
defined type alias q

我怀疑发生了其他事情

2)我怀疑这在规范中的唯一原因是支持package objects. 如果我们写

package object foo {
  val x = 5
  val y = this
}

那么说这不是一个值会很奇怪foo(而且说这不是一个值尤其奇怪y)。如果一个普通的包在我们为它定义了 a 之后就神奇地产生了一个值package object,那也很奇怪。

3)我看不到任何方法可以做到这一点,因为我看不到任何访问该值的方法。该错误甚至说包不是一个值:

val f = foo
test.scala:10: package foo is not a value

foo在某种意义上可能是该值“存在”,但没有办法在源代码中命名它(包对象本身除外)?

于 2014-11-05T11:05:04.527 回答