对于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
答案 0 :(得分:7)
您的二传手需要命名为foo_=
和position_=
。如果将它们命名为foo_
和position_
,则编译器不会将它们识别为setter。
答案 1 :(得分:5)
要实施的签名是:
def position_=(position: Vector2): Unit
所以你想要纠正你的代码:
def position_=(position: Vector2) { _position = position }