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-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 

毫无疑问,我的理解是不完整的。