scala Predef对象中无法识别的代码

时间:2013-12-07 23:13:19

标签: scala

有人可以在Predef对象中解释以下代码吗?感谢。

scala.`package`     // to force scala package object to be seen.
scala.collection.immutable.List // to force Nil, :: to be seen.

2 个答案:

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

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