gpt4 book ai didi

scala - 根据 Scala 语言规范,包是 AnyRef 值并具有类型。这有什么意义?

转载 作者:行者123 更新时间:2023-12-01 09:39:48 25 4
gpt4 key购买 nike

我正在阅读 Scala 语言规范,我遇到了一些令人困惑的事情,即包是值并且它们确实有类型的含义。

以下是我从 Scala 语言规范中得出的结论(也许是错误的?):

背景:

type designators部分,它是这样写的:

SimpleType ::= StableId

A type designator refers to a named value type. It can be simple or qualified. All such type designators are shorthands for type projections.

Specifically, the unqualified type name t where t is bound in some class, object, or package C is taken as a shorthand for C.this.type#t. If t is not bound in a class, object, or package, then t is taken as a shorthand for ε.type#t.

A qualified type designator has the form p.t where p is a path and t is a type name. Such a type designator is equivalent to the type projection p.type#t.

Some type designators and their expansions are listed below. We assume a local type parameter t, a value maintable with a type member Node and the standard class scala.Int,

enter image description here

此外,通过考虑 type projection定义:

SimpleType ::= SimpleType ‘#’ id

A type projection T#x references the type member named x of type T.

最后,singleton type定义说:

SimpleType ::= Path ‘.’ type

A singleton type is of the form p.type, where p is a path pointing to a value expected to conform to scala.AnyRef. The type denotes the set of values consisting of null and the value denoted by p.

推理链:

所以,我们知道:

1) scala.Int中的scala是一个包。

2) scala.Int 只是 scala.type#Int 的语法糖(如 type designator definition 中的解释和上图中所示)

3) scala.type#Int 是类型投影,其中 scala.type 必须是根据 the type projection definition 的类型其中指出:

A type projection T#x references the type member named x of type T.

4) 所以 scala.type 是一个类型!即,根据definition of singleton types,它是单例类型。 ,它说:

A singleton type is of the form p.type, where p is a path pointing to a value expected to conform to scala.AnyRef.

5) scala对应p是一个符合AnyRef的value

6) 在 Scala 语言规范中 here上面写着:

Every value in Scala has a type...

7) 所以包 scala 有一个类型。

问题:

1) 这个推理正确吗? scala 包真的是一个符合 AnyRef 的值吗?如果这个推理不正确,请解释原因。

假设上面的推理是正确的并且包 scala 确实是一个值:

2) 在什么意义上包 scala 是一个值?那有什么意义呢?在什么情况下,我们可以将 scala 视为一个值,就像我们将 5:Int 视为具有类型的值 5 一样整数?

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

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

最佳答案

基于实验而非规范:

1) 包有类型,但它们符合Any,而不是AnyRef。您不能将它们分配给 type:

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 object。如果我们写

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

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

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

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

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

关于scala - 根据 Scala 语言规范,包是 AnyRef 值并具有类型。这有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26754037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com