我经常遇到这样的情况,即我有一些特征的工厂方法,并且参数的名称与特征的成员冲突导致它们被隐藏:
trait MyTrait {
val a: Int
val b: String
}
object MyTrait {
def apply(a: Int, b: String): MyTrait = new MyTrait {
val a = a // Recursive infinite loop.
val b = b
}
}
Run Code Online (Sandbox Code Playgroud)
所以通常我必须做一些丑陋的事情:
def apply(aA: Int, bB: String): MyTrait = new MyTrait {
val a = aA
val b = bB
}
Run Code Online (Sandbox Code Playgroud)
或制作参数的本地副本:
def apply(a: Int, b: String): MyTrait = {
val localA = a
val localB = b
new MyTrait {
val a = localA
val b = localB
}
Run Code Online (Sandbox Code Playgroud)
我希望该apply方法的参数与我的特征的成员相同,以便在使用命名参数时客户端代码读取得很好:例如MyTrait(a=3,b="123").
是否有一个更简洁的机制,让我捕获定义参数参数的外部范围,但匿名类还没有?例如:
def apply(a: Int, b: String): MyTrait = { outer =>
new MyTrait {
val a = outer.a
val b = outer.b
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
如果我们需要创建一个实例,为什么不将其委托给构造函数呢?所以我可以想到这个黑客:
trait MyTrait {
def a: Int
def b: String
}
object MyTrait {
private class MkMyTrait(val a: Int, val b: String) extends MyTrait
def apply(a: Int, b: String): MyTrait = new MkMyTrait(a, b)
}
Run Code Online (Sandbox Code Playgroud)