Scala—不应用规则
我想知道Scala中是否有一个规则,或者说是一个“最佳实践”,用于覆盖的apply/unapply。我特别感兴趣的是持有以下财产是否是一个好主意: 给定案例类别C(x:T),对于所有x,一些(x)==C.unapply(C.apply(x)) 我问这个问题的原因是因为我计划使用以下代码来确保BigDecimal的精度为16Scala—不应用规则,scala,case-class,Scala,Case Class,我想知道Scala中是否有一个规则,或者说是一个“最佳实践”,用于覆盖的apply/unapply。我特别感兴趣的是持有以下财产是否是一个好主意: 给定案例类别C(x:T),对于所有x,一些(x)==C.unapply(C.apply(x)) 我问这个问题的原因是因为我计划使用以下代码来确保BigDecimal的精度为16 class BoundedBigDecimal(private val bd: BigDecimal) extends Proxy { val self: BigDeci
class BoundedBigDecimal(private val bd: BigDecimal) extends Proxy {
val self: BigDecimal = bd setScale (BoundedBigDecimal.PRECISION)
}
object BoundedBigDecimal {
val PRECISION = 16
def apply(bd: BigDecimal) = new BoundedBigDecimal(bd)
def unapply(bbd: BoundedBigDecimal) = Some(bbd.self)
}
正如你所看到的,财产不一定在这里
是:
1) 理想情况下应在一般情况下强制执行的财产
2) 做我想做的事的正确方法
谢谢 为什么不使用:
def testPrecision(bd:BigDecimal):Boolean =
db.scale == 16
还是我遗漏了什么
编辑:更新为简化精度:
def boundedBD(bd:BigDecimal):BigDecimal =
{
val maxPrecision = 16
bd.scale match {
case x if x > maxPrecision => bd setScale maxPrecision
case _ => bd
}
}
我更喜欢使用“标记类型”来表示:
type Tagged[U] = { type Tag = U }
type @@[T, U] = T with Tagged[U]
trait Bounded
object BoundedBigDecimal {
val PRECISION = 16
def apply(bd: BigDecimal) =
(bd setScale PRECISION).asInstanceOf[BigDecimal @@ Bounded]
def unapply(bbd: BigDecimal @@ Bounded) =
Some(bbd)
implicit def toBD(bd: BigDecimal): BigDecimal @@ Bounded =
BoundedBigDecimal(bd)
}
很好地描述了标记类型以及使用is和的好处。感谢您的回答!实际上,重点不是测试精度是否为16,重点是强制每个大十进制数的精度最多为16。这就是为什么我要定义这个BoundedBigDecimal,使BoundedBigDecimal(1.1111111111111111111111111111111)变成1.1111111111111111。如果我的问题不清楚,很抱歉……但与Haskell中的
newtype
s不同,Scala中的标记类型不会阻止您意外添加两个不同的标记BigDecimal
s,正如第一篇文章所述。