如何解决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
相关产品推荐
相关产品推荐

