在赋值表达式中找不到明确定义的setter

Sku*_*del 2 scala properties

对于Scala属性,我有一个小难题.

各种博客和教程告诉我这个:

class Something
{
    var foo = 1
}
Run Code Online (Sandbox Code Playgroud)

......可以指定为......

class Something
{
    private var _field = 1

    def foo = _field
    def foo_(foo: Int) = _field = foo
}
Run Code Online (Sandbox Code Playgroud)

这对我来说非常有意义,在进行赋值时,编译器会查找name_方法.问题是它似乎对我不起作用.

在下面的真实代码中(同样的事情也发生在其他类中):

class Camera
{
  private var _position = Vector2.zero

  def position: Vector2 = _position
  def position_(position: Vector2) =
  {
    // Do boring transforms.
    _position = position // position shadows outer scope so this does work.
  }
}

// ...
val camera = new Camera
camera.position = Vector2(10, 0)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

错误:value position_ =不是Camera camera.position = Vector(10,0)的成员

相反,我需要通过以下方式调用它来实际使其工作:camera.position_(Vector2(10, 0))既不美观也不可读.

在其他情况下,例如在尝试使用公共getter和私有设置器时,我遇到了同样的问题.

我究竟做错了什么?

在Java HotSpot VM 1.6上使用scalac 2.8.0

Dav*_*ith 7

你的安装者需要被命名foo_=position_=.如果您命名它们foo_并且position_编译器不将它们识别为setter.


huy*_*hjl 5

要实施的签名是:

def position_=(position: Vector2): Unit
Run Code Online (Sandbox Code Playgroud)

所以你想要像这样纠正你的代码:

def position_=(position: Vector2) { _position = position }
Run Code Online (Sandbox Code Playgroud)