如何解决Scala“重新分配给Val”的错误?

y1aodyip  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(141)

我正在尝试封装一些代码,但在Scala中,由于某些原因,您必须直接访问变量。为什么这段代码不能编译?

class MyRender {
  var camera_pitch = 0.2d
}

class MyDisplay {
  val render = new MyRender()

  def camera_pitch():Double = {
    render.camera_pitch
  }
  def camera_pitch_=(pitch: Double) = {
    render.camera_pitch = pitch
  }
}

class MyWorld {
  val display = new MyDisplay()
}

class MyEntity {
  val world = new MyWorld()
  val pitch = 4d

  def update() = {
    world.display.camera_pitch = pitch          //this fails
    world.display.render.camera_pitch = pitch   //this works
  }
}

我收到以下错误:

[error] Test.scala:33:32: reassignment to val
[error]     world.display.camera_pitch = this.pitch
mrfwxfqh

mrfwxfqh1#

我将您的示例代码复制到终端中。这会失败,因为var被同名的函数隐藏。
您必须选择不同的变量名或函数名。Scala有一些有趣的行为,其中变量和函数可以互换,但这种情况是不允许的。
我个人会直接从MyDisplay上删除这个功能

def camera_pitch():Double = {
    render.camera_pitch
}

在外部代码中,我会调用world.display.render.camera_pitch

  • 离题,但这不是Scala-ESC代码,因为它使用var和OO setter/getter风格,这使得对多代码性能的推理变得困难。*

相关问题