我不禁觉得你的要求有点不合理。如前所述,宏应该是可能的。但通常如果您对提供的构造函数/工厂不满意,那么您必须编写自己的包装器/工厂。就我个人而言,我认为我们可能想重新审视一下默认值、Null 对象和 Option 类的整个问题。但是,可以在没有宏的情况下删除样板。在您的实用程序包中放置一个隐式布尔值:
implicit class BooleanRich2(n : Boolean) {
def apply[T](v1: T, v2: T): T = if (n) v1 else v2
}
然后说我们希望使用以下我们无法修改的类:
final class A(val p1: Int = 1, val p2: Int = 2, val p3: Int = 3, val p4: Int = 4){
override def toString = s"p1: $p1, p2: $p2, p3: $p3, p4: $p4"
}
我们可以按如下方式使用它:
var c1 = true
var c2 = false
def c3(s: String) = (s =="")
val a = new A(c1(20, 1)) //p1: 20, p2: 2, p3: 3, p4: 4
println(a) //p1: 20, p2: 2, p3: 3, p4: 4
val b = new A(p3 = c2(20, 3), p4 = c3("")(20, 4))
println(b) //p1: 1, p2: 2, p3: 3, p4: 20
val c = new A(p3 = c1(20, 3), p4 = c3("A non empty String")(20, 4))
println(c) //p1: 1, p2: 2, p3: 20, p4: 4