什么是包对象,而不是概念,而是它们的用法?

我尝试使示例工作,而我上类的唯一形式如下:

package object investigations {
    val PackageObjectVal = "A package object val"
}

package investigations {

    object PackageObjectTest {
        def main(args: Array[String]) {
            println("Referencing a package object val: " + PackageObjectVal)
        }
    }
}

我到目前为止所做的观察是:
package object _root_ { ... }

被禁止(这是合理的),
package object x.y { ... }

也不允许。

似乎必须在直接父包中声明一个包对象,并且,如果如上所述,则需要用大括号分隔的包声明形式。

它们是常用的吗?如果是这样,怎么办?

最佳答案

通常,您会将包对象放在对应的包中名为package.scala的单独文件中。您也可以使用嵌套的包语法,但这很不常见。

包对象的主要用例是,当您使用包定义的API时,需要在包内以及包外的各个位置进行定义。这是一个例子:

// file: foo/bar/package.scala

package foo

package object bar {

  // package wide constants:
  def BarVersionString = "1.0"

  // or type aliases
  type StringMap[+T] = Map[String,T]

  // can be used to emulate a package wide import
  // especially useful when wrapping a Java API
  type DateTime = org.joda.time.DateTime

  type JList[T] = java.util.List[T]

  // Define implicits needed to effectively use your API:
  implicit def a2b(a: A): B = // ...

}

现在,该包对象内的定义在整个包foo.bar中可用。此外,当该包之外的人导入foo.bar._时,将导入定义。

这样一来,您就可以避免要求API客户端发出其他导入内容以有效使用您的库,例如在scala-swing中,您需要编写
import swing._
import Swing._

具有onEDT之类的所有优点,以及从Tuple2Dimension的隐式转换。

10-04 21:18