如何在Scala中模拟“assign-once”var?
发布时间:2020-12-16 18:25:20 所属栏目:安全 来源:网络整理
导读:这是 my previous initialization variable question的后续问题. 假设我们正在处理这种情况: object AppProperties { private var mgr: FileManager = _ def init(config: Config) = { mgr = makeFileManager(config) }} 此代码的问题是AppProperties中的任
这是
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 :-)).还有其他想法吗? 解决方法
您可以使用implicits进行此操作,使隐式仅在应该能够重新分配的方法中可用.查看该值不需要隐式,因此“变量”对其他方法可见:
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()) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |