我什么时候应该使用Scala的`package`特殊标识符?

Jea*_*let 10 scala package

在Scala中,您可以定义包对象.因此,您似乎可以通过编写包名来访问该包对象,然后`package`:

// file package.scala in src/com

package com
package object test {
  val Version = 2
}

// file Test.scala in src/test

package test
object Test {
  def main(args: Array[String]) {
    val p = com.test.`package`          // get ref on package object
    val v1 = com.test.`package`.Version // (1) get val
    val v2 = com.test.Version           // (2) get val
  }
}
Run Code Online (Sandbox Code Playgroud)

(1)和(2)之间有什么区别?在某些情况下,我必须编写额外`package`的代码才能运行.应该有区别还是编译器错误?

此外,这条线的含义是Predef.scala什么?

scala.`package`   // to force scala package object to be seen.
Run Code Online (Sandbox Code Playgroud)

Deb*_*ski 4

只是一个盲目的猜测:这条线

\n\n
scala.`package`\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是一个简单的getstatic(包目标代码),后跟pop. 所以它除了初始化包对象(如果它之前没有初始化\xe2\x80\x99)之外什么也不做。

\n\n

所以我的猜测是,Predef.scala您无法确定(或者可以确定它没有发生)包对象已经被初始化。大多数其他模块可能隐式依赖于Predef加载,因此这些模块不能盲目初始化。因此,需要通过将模块/包/对象显式包含在Predef. List 模块和 StringBuilder 也是如此。所以,这可能只是一个初始化顺序的事情。

\n