2013-12-07 75 views

回答

7

Link)。我只能猜測。當您將單例對象用作表達式時,這與強制執行lazy val的評估具有相同的效果,換句話說,如果該對象尚未初始化,它將運行對象的主體。

例如:

object Foo { 
    println("Foo is launching rockets...") 
} 

現在,當你寫的只是

Foo // prints `Foo is launching rockets...` 

這種強制的Foo內容的評價。

所以我的猜測是,在Predef這只是確保scala包對象和List中的某些東西被初始化。非常不可能的事情,你會打擾用戶。

2

接受的答案必須是錯誤的。

更新:ML提供一對夫婦有用的鏈接問題,不說問題是否只runtime dependencies between modules或也compiler-internalsimilar

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 

毫無疑問,我的理解是不完整的。