对于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
要实施的签名是:
def position_=(position: Vector2): Unit
Run Code Online (Sandbox Code Playgroud)
所以你想要像这样纠正你的代码:
def position_=(position: Vector2) { _position = position }
Run Code Online (Sandbox Code Playgroud)