scala中无法识别的代码Predef对象
问题描述:
有人可以在Predef对象中解释下面的代码吗?谢谢。scala中无法识别的代码Predef对象
scala.`package` // to force scala package object to be seen.
scala.collection.immutable.List // to force Nil, :: to be seen.
答
(Link)。我只能猜测。当您将单例对象用作表达式时,这与强制执行lazy val
的评估具有相同的效果,换句话说,如果该对象尚未初始化,它将运行对象的主体。
例如:
object Foo {
println("Foo is launching rockets...")
}
现在,当你写的只是
Foo // prints `Foo is launching rockets...`
这种强制的Foo
内容的评价。
所以我的猜测是,在Predef
这只是确保scala
包对象和List
中的某些东西被初始化。非常不可能的事情,你会打扰用户。
答
接受的答案必须是错误的。
更新:ML提供一对夫妇有用的链接问题,不说问题是否只runtime dependencies between modules或也compiler-internal或similar。
Predef导入编译时间在编译源文件时提供各种定义。 (更新:但仍带有一些值定义,并不是所有的方法都是内联的,并且在任何情况下,即使是内联使用,例如assert
,都会引起Predef$.MODULE$
,因为初始化时会产生副作用,请参阅下面的内容)
您可以用-Yno-predef
关闭该行为。例如,
[email protected]:~/goof$ scala -Yno-predef
Welcome to Scala version 2.10.3 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala> "a" -> 1
<console>:8: error: value -> is not a member of String
"a" -> 1
^
它与运行时评估无关。
否则,所有在Predef
及其引用的所有内容都会在程序有机会运行之前加载。
:
在Scala中,import
不像#include
(更新是啊,你猜怎么着。)。
有用的练习:
scala> :javap -prv scala.Predef$
private scala.Predef$();
flags: ACC_PRIVATE
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: invokespecial #520 // Method scala/LowPriorityImplicits."<init>":()V
4: aload_0
5: putstatic #522 // Field MODULE$:Lscala/Predef$;
8: aload_0
9: invokestatic #526 // Method scala/DeprecatedPredef$class.$init$:(Lscala/Predef$;)V
12: getstatic #531 // Field scala/package$.MODULE$:Lscala/package$;
15: pop
16: getstatic #536 // Field scala/collection/immutable/List$.MODULE$:Lscala/collection/immutable/List$;
19: pop
20: aload_0
21: getstatic #540 // Field scala/collection/immutable/Map$.MODULE$:Lscala/collection/immutable/Map$;
24: putfield #151 // Field Map:Lscala/collection/immutable/Map$;
// etc, etc
毫无疑问,我的理解是不完整的。