Scala—不应用规则

Scala—不应用规则,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

我想知道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: 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,正如第一篇文章所述。