Please consider this code:
trait A {
def a : Int
}
def f ( a : Int ) = {
def a0 = a
new A {
def a = a0
}
}
The problem is quite evident: def a0 = a
is a typical annoying boilerplate code and the situation only worsens when more parameters get introduced.
I am wondering if it's possible to somehow get a direct reference to the a
variable of the outer scope inside the declaration of the instance of the trait and thus to get rid of the intermediate a0
.
Please keep in mind that changing name of input parameter of the function is not allowed as is changing the trait.
I don't think there is direct way to do that, because it would require some special (hypothetical) identifier thisMethod
. However, depending on your context, the following two ways to avoid the name shadowing might be possible:
(1) Replace anonymous class A
with implementing class:
case class AImpl(a: Int) extends A
def f(a : Int): A = AImpl(a)
(2) Define f
in an abstract trait and use a concrete implementation for it:
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With