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

如何解决Scala中的‘reassignment to val’赋值错误?

为什么这段Scala代码编译失败?

你这段代码编译失败的核心原因是Scala的属性访问语法糖对getter方法的格式有严格要求。

在Scala中,如果你想通过obj.property = value的语法糖来调用对应的setter方法(命名为property_=),对应的getter方法必须满足两个条件:

  • 方法名和setter的前缀完全一致(这里就是camera_pitch)
  • getter方法不能带括号

你的MyDisplay类里,getter方法定义成了带括号的def camera_pitch():Double,这会让编译器把world.display.camera_pitch解析为一次方法调用,返回的是一个不可变的Double值(Scala中基本类型是不可变的),所以后续的= pitch就变成了给一个val赋值,自然会报reassignment to val的错误。

而直接访问world.display.render.camera_pitch能正常运行,是因为这里访问的是MyRender类里的var变量,编译器直接识别为可变变量的赋值操作,不需要通过语法糖解析getter/setter。

修复方案

只需要把MyDisplay中的getter方法去掉括号,改成无参方法的形式即可:

class MyDisplay {
  val render = new MyRender()

  def camera_pitch:Double = {  // 去掉括号
    render.camera_pitch
  }
  def camera_pitch_=(pitch: Double) = {
    render.camera_pitch = pitch
  }
}

这样编译器就能正确识别world.display.camera_pitch = pitch是调用camera_pitch_=方法,编译就能通过了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:15:53