获取对具有冲突名称的外部函数的参数的引用

Nik*_*kov 5 scope scala

请考虑以下代码:

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.

请记住,改变特征时不允许更改函数输入参数的名称.

0__*_*0__ 4

我认为没有直接的方法可以做到这一点,因为它需要一些特殊的(假设的)标识符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)