有人可以在Predef對象中解釋下面的代碼嗎?謝謝。scala中無法識別的代碼Predef對象
scala.`package` // to force scala package object to be seen.
scala.collection.immutable.List // to force Nil, :: to be seen.
有人可以在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
毫無疑問,我的理解是不完整的。