2010-10-10 18 views
2

对于Scala属性,我有一个小小的难题。在赋值表达式中找不到明确定义的setter

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

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) 

我得到一个错误:

error: value position_= is not a member of Camera camera.position = Vector(10, 0)

相反,我需要调用它下面的方式实际上使它工作:camera.position_(Vector2(10, 0))这既不美观也不可读。

在其他情况下,例如,当尝试拥有公共getter和私人setters时,我面临同样的问题。

我在做什么错?

上的Java HotSpot虚拟机使用scalac 2.8.0 1.6

回答

7

你制订者必须被命名为foo_=position_=。如果您将它们命名为foo_position_,则编译器不会将它们识别为设置程序。

+0

谢谢。我应该多注意错误信息:) – Skurmedel 2010-10-10 22:28:16

5

签名来实现的:

def position_=(position: Vector2): Unit 

所以要更正你这样的代码:

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

谢谢! ......感叹,可悲的是,当我想到这一点时,这是相当明显的。只能提高一个,所以我采取了最快的答案。 – Skurmedel 2010-10-10 22:27:27

+1

用大括号替换equals是不必要的。编译器会自动从'_position = position'赋值来推断'Unit',并自动给'position_ ='方法返回'Unit'的正确返回类型。 – 2010-10-11 01:08:19