Scala - 应用不适用的规则

时间:2013-11-07 21:41:10

标签: scala case-class

我想知道在Scala中是否存在规则或者更确切地说是“最佳实践”以覆盖apply / unapply。我特别感兴趣的是保持以下属性是否是个好主意:

给定案例类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)正确的方法去做我想做的事情?

谢谢!

2 个答案:

答案 0 :(得分: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)
}

标记类型的良好描述及其使用的好处是herehere

答案 1 :(得分: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
}


}