You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala如何基于方法传入值实例化顶层lazy值

解决方案

Scala 中 val(包括懒加载的 lazy val)属于不可变变量,声明后无法二次赋值,因此直接写 env = e 语法不合法。我们可以通过私有可变中间变量承接传入值,再让 lazy val 从该变量读取实现需求,同时保留 Foo 对 Props 特质的继承关系。
修改后可用代码如下:

trait Props {
  val env: String
}

object Exc extends App {
  Foo.getInput("dev")
  Foo.exampleMethod() // 输出 dev
}

object Foo extends Props {
  // 私有可变变量存储传入的环境值,用Option做安全校验
  private var inputEnv: Option[String] = None
  
  lazy val env: String = inputEnv.getOrElse(throw new IllegalStateException("请先调用 getInput 方法传入环境参数,再访问 env"))
  
  def getInput(e: String): Unit = {
    // 仅允许赋值一次,符合val不可变的语义,避免被意外修改
    if (inputEnv.isEmpty) {
      inputEnv = Some(e)
    } else {
      throw new IllegalStateException("env 已经完成初始化,不可重复赋值")
    }
  }

  def exampleMethod() = println(env)
}

注意事项

  • 必须保证调用顺序:先调用 getInput 传入参数,再访问 env 或调用依赖 env 的方法,否则会抛出初始化异常
  • 懒加载的 val 仅会在第一次访问时初始化一次,如果 env 已经被加载过,后续再修改 inputEnv 的值也不会改变 env 的取值

内容的提问来源于stack exchange,提问作者ni_i_ru_sama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:36:02