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

时间:2010-10-10 22:03:57

标签: scala properties

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

各种博客和教程告诉我:

class Something
{
    var foo = 1
}

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

class Something
{
    private var _field = 1

    def foo = _field
    def foo_(foo: Int) = _field = foo
}

这对我来说非常有意义,在执行赋值时,编译器会查找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)

我收到错误:

  

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

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

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

我做错了什么?

在Java HotSpot VM 1.6上使用scalac 2.8.0

2 个答案:

答案 0 :(得分:7)

您的二传手需要命名为foo_=position_=。如果将它们命名为foo_position_,则编译器不会将它们识别为setter。

答案 1 :(得分:5)

要实施的签名是:

def position_=(position: Vector2): Unit

所以你想要纠正你的代码:

def position_=(position: Vector2) { _position = position }