什么是包对象,而不是概念,而是它们的用法?
我尝试使示例工作,而我上类的唯一形式如下:
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
之类的所有优点,以及从Tuple2
到Dimension
的隐式转换。