SIP-15暗示人们可以使用值类来定义新的数字类,例如正数。是否可以编写这样的约束,使得在没有构造函数的情况下,基础> 0,而不必调用单独的方法来验证约束(即,创建此类的有效实例是简洁的)?
如果值类具有构造函数的概念,则可以在该位置进行如下所示的验证,但是不支持这种验证(即,下面的代码将无法编译)
implicit class Volatility(val underlying: Double) extends AnyVal {
require(!underlying.isNaN && !underlying.isInfinite && underlying > 0, "volatility must be a positive finite number")
override def toString = s"Volatility($underlying)"
}
Volatility(-1.0) //should ideally fail
最佳答案
您可以使用refined通过使用精致的Double
谓词完善Positive
来提升验证步骤来编译时间:
import eu.timepit.refined.auto._
import eu.timepit.refined.numeric._
import shapeless.tag.@@
scala> implicit class Volatility(val underlying: Double @@ Positive) extends AnyVal
defined class Volatility
scala> Volatility(1.5)
res1: Volatility = Volatility@3ff80000
scala> Volatility(-1.5)
<console>:52: error: Predicate failed: (-1.5 > 0).
Volatility(-1.5)
^
请注意,最后一个错误是编译错误,而不是运行时错误。
关于scala - 值类中的验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33136558/