从 2.10 开始,-Xlint
抱怨在包对象内部定义的类。但为什么?在包对象中定义一个类应该与在一个单独的包中定义具有相同名称的类完全相同,除了方便得多。
在我看来,Scala 的严重设计缺陷之一是无法在文件的顶层放置除类实体(例如变量声明、函数定义)之外的任何内容。相反,您被迫将它们放入一个单独的“包对象”(通常package.scala
在也是。我看不出 Scala 在概念上为什么不能在顶层允许它在较低级别允许的任何东西,并且任何非类的东西都会自动放入包对象中,这样用户就不必担心它了。
例如,在我的例子中,我有一个util
包,在它下面有许多子包(util.io
、util.text
、util.time
、util.os
、util.math
、util.distances
等),这些子包将函数、类和有时是语义相关的变量的异构集合分组。我目前将所有各种函数、类等存储在目录package object
中一个名为io.scala
或text.scala
其他的文件中util
。这很好用,而且非常方便,因为可以混合函数和类,例如,我可以执行以下操作:
package object math {
// Coordinates on a sphere
case class SphereCoord(lat: Double, long: Double) { ... }
// great-circle distance between two points
def spheredist(a: SphereCoord, b: SphereCoord) = ...
// Area of rectangle running along latitude/longitude lines
def rectArea(topleft: SphereCoord, botright: SphereCoord) = ...
// ...
// ...
// Exact-decimal functions
class DecimalInexactError extends Exception
// Format floating point value in decimal, error if can't do exactly
formatDecimalExactly(val num: Double) = ...
// ...
// ...
}
如果没有这个,我将不得不根据乐趣与类而不是语义来不方便地拆分代码。我想,另一种选择是将它们放在一个普通的对象中——这有点违背了首先拥有包装对象的目的。