加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在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())                                                                                                                                                                                             
  }                                                                                                                                                                                                            

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读