在Scala中是否有一种实用的方法来表达数字值和类型的范围,采用Ada的风格?
-- newtype derived from Float
type Pounds is new Float;
-- constraint on an individual variable
Cat_Weight: Pounds range 0.0 .. 10.0;
-- constraint on an entire subtype of Float
subtype People_Pounds is Pounds range 0.0 .. 300.0;
(好吧,不是最现实的例子,而是改编自Ada Safe and Secure。据我所知,Ada中的范围检查是运行时检查,如果违反则会抛出异常,如果需要可以在生产中禁用。 )
理想情况下使用未装箱的表示,但对任何实际解决方案感兴趣。 Value classes似乎不是一种选择,至少不是孤立的:
class Month(val m: Int) extends AnyVal {
assert(m >= 1 && m <= 12) // Does not compile: assertion not allowed
}
我们可以使用assert
或require
创建一个案例类:
case class Month2(val m: Int) {
require(m >= 1 && m <= 12)
}
但是这不是一个Integer子类型,我们可能需要给它一个Numeric类型类实例 - 这是唯一的方法吗?