1

我想知道Scala中是否有规则或者“最佳实践”来覆盖应用/取消应用。我特别感兴趣的是拥有以下属性是否是一个好主意:

给定案例类 C(x: T),对于所有 x,Some(x) == C.unapply(C.apply(x))。

我问的原因是因为我计划使用以下代码来确保 BigDecimal 的精度为 16。

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)做我想做的事情的正确方法?

谢谢!

4

2 回答 2

2

我更喜欢为此使用“标记类型”:

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)
}

此处此处对标记类型及其使用的好处进行了很好的描述。

于 2013-11-08T06:16:52.207 回答
0

为什么不使用:

def testPrecision(bd:BigDecimal):Boolean = 
db.scale == 16

还是我错过了什么?

编辑:更新到 ReducePrecision:

def boundedBD(bd:BigDecimal):BigDecimal =
{   
   val maxPrecision = 16
   bd.scale match {
   case x if x > maxPrecision  => bd setScale  maxPrecision 
   case _ => bd
}


}
于 2013-11-07T22:14:14.037 回答