请考虑以下代码:
trait A {
def a : Int
}
def f ( a : Int ) = {
def a0 = a
new A {
def a = a0
}
}
Run Code Online (Sandbox Code Playgroud)
问题非常明显:这def a0 = a
是一个典型的烦人的样板代码,当引入更多参数时情况才会恶化.
我想知道是否有可能以某种方式直接引用a
特征实例的声明中的外部范围的变量,从而摆脱中间体a0
.
请记住,改变特征时不允许更改函数输入参数的名称.
我认为没有直接的方法可以做到这一点,因为它需要一些特殊的(假设的)标识符thisMethod
。但是,根据您的上下文,可能可以使用以下两种方法来避免名称隐藏:
(1)A
用实现类替换匿名类:
case class AImpl(a: Int) extends A
def f(a : Int): A = AImpl(a)
Run Code Online (Sandbox Code Playgroud)
(2) 在抽象特征中定义f
并为其使用具体实现:
trait F {
def f(a: Int): A
}
object FImpl extends F {
def f(a0: Int): A = new A { val a = a0 }
}
def test(factory: F): A = factory.f(a = 33)
Run Code Online (Sandbox Code Playgroud)