gpt4 book ai didi

scala - 如何在Scala中模拟 “assign-once” var?

转载 作者:行者123 更新时间:2023-12-03 09:49:09 25 4
gpt4 key购买 nike

这是my previous initialization variable question的后续问题。

假设我们正在处理以下上下文:

object AppProperties {

private var mgr: FileManager = _

def init(config: Config) = {
mgr = makeFileManager(config)
}

}

此代码的问题在于, AppProperties中的任何其他方法都可能会重新分配 mgr。是否有一种可以更好地封装 mgr的技术,使其他方法看起来像 val?我已经考虑过这样的事情(受 this answer的启发):
object AppProperties {

private object mgr {
private var isSet = false
private var mgr: FileManager = _
def apply() = if (!isSet) throw new IllegalStateException else mgr
def apply(m: FileManager) {
if (isSet) throw new IllegalStateException
else { isSet = true; mgr = m }
}
}

def init(config: Config) = {
mgr(makeFileManager(config))
}

}

...但是这对我来说是相当沉重的(初始化让我想起了太多的C++ :-)。还有其他想法吗?

最佳答案

您可以使用隐式方法做到这一点,使隐式方法仅在应该能够重新分配的方法中可用。查看值不需要隐式,因此“变量”对其他方法可见:

sealed trait Access                                                                                                                                                                                            

trait Base {

object mgr {
private var i: Int = 0
def apply() = i
def :=(nv: Int)(implicit access: Access) = i = nv
}

val init = {
implicit val access = new Access {}

() => {
mgr := 5
}
}

}

object Main extends Base {

def main(args: Array[String]) {
println(mgr())
init()
println(mgr())
}

}

关于scala - 如何在Scala中模拟 “assign-once” var?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404024/

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