在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)
只是一个盲目的猜测:这条线
\n\nscala.`package`\nRun Code Online (Sandbox Code Playgroud)\n\n结果是一个简单的getstatic(包目标代码),后跟pop. 所以它除了初始化包对象(如果它之前没有初始化\xe2\x80\x99)之外什么也不做。
所以我的猜测是,Predef.scala您无法确定(或者可以确定它没有发生)包对象已经被初始化。大多数其他模块可能隐式依赖于Predef加载,因此这些模块不能盲目初始化。因此,需要通过将模块/包/对象显式包含在Predef. List 模块和 StringBuilder 也是如此。所以,这可能只是一个初始化顺序的事情。