在设置值之前修改case类构造函数参数

Dav*_*les 10 scala case-class

在Scala成为一个参数apply()之前,是否有一种方法可以修改传递给单参数案例类构造函数/ 方法的参数val?例如

case class AbsVal private(aVal: Double)

object AbsVal {
    def apply(aVal: Double): AbsVal = AbsVal(Math.abs(aVal)) // doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

当然,这对于重载定义的模糊引用是失败的.我想也许我可以使用命名参数(以及构造函数vs的不同参数名称apply())来欺骗它,但这也不起作用.

当然,而不是apply()我可以拥有私有构造函数和工厂方法,但是不得不乱丢代码AbsVal.make(x)而烦人AbsVal(x).

win*_*ner 5

abstract case class AbsVal private(value: Double)

object AbsVal {
  def apply(value: Double): AbsVal = new AbsVal(Math.abs(value)) {}
}
Run Code Online (Sandbox Code Playgroud)

抽象案例类没有在其伴随对象中自动生成的apply方法.这让我们创造了自己的.我们必须创建另一个继承自case类(匿名,这里)的类,但toString为case类生成的方法仍会将其显示为a AbsVal,因此它也应该是不可见的.甲copy方法并不自动为抽象类的情况下产生的,但对于这样一个单一的参数的一类它不会是有用无论如何(和它总是可以被手动定义,见LimbSoup的答案).

Case类继承通常是一个坏主意,但由于私有构造函数,唯一存在的子类将是我们定义的匿名子类,因此在这种情况下它是安全的.