有人可以在Predef对象中解释以下代码吗?感谢。
scala.`package` // to force scala package object to be seen.
scala.collection.immutable.List // to force Nil, :: to be seen.
答案 0 :(得分:7)
(Link)。我只能猜测。当您使用单例对象作为表达式时,这与强制评估lazy val
具有相同的效果,换句话说,如果它尚未初始化,它将运行对象的主体。
例如:
object Foo {
println("Foo is launching rockets...")
}
现在你只写
Foo // prints `Foo is launching rockets...`
这会强制评估Foo
。
所以我的猜测是,在Predef
中,这只是确保scala
包对象和List
中的某些内容已初始化。非常不可能你会打扰用户。
答案 1 :(得分:2)
接受的答案必须是错误的。
更新:ML提供了几个有用的问题链接,但没有说明问题是runtime dependencies between modules还是compiler-internal还是similar。
在编译时导入Predef,以便在编译源文件时提供各种定义。 (更新:但仍然带有一些值定义,并不是所有的方法都被内联。在任何情况下,即使是assert
的内联用法,也会引用Predef$.MODULE$
,因为初始化时的副作用,见下文。)
您可以使用-Yno-predef
关闭该行为。例如,
apm@mara:~/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
毫无疑问,我的理解是不完整的。