Scala - 如何创建匿名类并避免隐藏参数名称

rmi*_*min 7 scala

我经常遇到这样的情况,即我有一些特征的工厂方法,并且参数的名称与特征的成员冲突导致它们被隐藏:

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)

谢谢!

4e6*_*4e6 2

如果我们需要创建一个实例,为什么不将其委托给构造函数呢?所以我可以想到这个黑客:

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)