gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:31:31 24 4
gpt4 key购买 nike

我经常遇到这样的情况,我有一个工厂方法用于某些 trait,并且参数的名称与 trait 的成员发生冲突,导致它们被隐藏:

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
}
}

所以通常我必须做一些丑陋的事情,比如:
    def apply(aA: Int, bB: String): MyTrait = new MyTrait {
val a = aA
val b = bB
}

或制作参数的本地副本:
    def apply(a: Int, b: String): MyTrait = {
val localA = a
val localB = b

new MyTrait {
val a = localA
val b = localB
}

我想要 apply 的参数方法与我的 trait 的成员相同,因此当我使用命名参数时客户端代码可以很好地读取:例如 MyTrait(a=3,b="123") .

是否有一种更简洁的机制可以让我捕获定义参数参数的外部范围,但匿名类还没有?例如:
    def apply(a: Int, b: String): MyTrait = { outer =>
new MyTrait {
val a = outer.a
val b = outer.b
}
}

谢谢!

最佳答案

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

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)
}

关于Scala - 如何创建匿名类并避免隐藏参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25655407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com