在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).
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类继承通常是一个坏主意,但由于私有构造函数,唯一存在的子类将是我们定义的匿名子类,因此在这种情况下它是安全的.
| 归档时间: |
|
| 查看次数: |
1933 次 |
| 最近记录: |