不(没有)Scala自动生成了setter吗?

时间:2011-02-05 14:09:01

标签: scala

谷歌和我失败的记忆都给了我一些提示,但是每一次尝试都是枯竭的。

class Y {
    var y = 0
}
var m = new Y()
m.y_(3)

error: value y_ is not a member of Y

请告诉我我做错了什么。 (另外:请告诉我它是什么我做错了。)

修改

我没有做错的事情,或者至少不是我唯一做错的事情,就是我调用setter的方式。以下内容也会失败,所有错误消息都是相同的:

m.y_ // should be a function valued expression
m.y_ = (3) // suggested by Google and by Mchl
f(m.y_) // where f takes Int => Unit as an argument
f(m.y)  // complains that I am passing in Int not a function

我通过SimplyScala这样做,因为我太懒了,不耐烦在我的小型家用机器上安装Scala。希望不是那个......

获胜者是......

Fabian,他指出我在_和=之间没有空格。我想出了为什么会这样,然后我想到了:

  

y的setter名称 y_,它是y_=

观察:

class Y {
     var y = 0
}
var m = new Y()
m.y_=(3)
m.y
res1: Int = 3
m.y_=
error: missing arguments for method y_= in class Y;
follow this method with `_` if you want to treat 
it as a partially applied function
       m.y_=
         ^
m.y_=_
res2: (Int) => Unit = 
def four(f : Int => Unit) = f(4) 
four(m.y_=)

m.y
res3: Int = 4

StackExchange上另一个成功的日子。

3 个答案:

答案 0 :(得分:8)

确实如此。它们只是透明的。

m.y = 3

这实际上是通过setter方法访问m.y

您可以直接致电m.y_=(3)

答案 1 :(得分:1)

从你的例子中判断一下有点困难,但似乎你试图将setter传递给一个函数,然后在它上面设置一个值。就是这样看:

f(m.y_) // where f takes Int => Unit as an argument
f(m.y)  // complains that I am passing in Int not a function

...建议有一个函数f,你想使用传入的setter设置一个值。

如果这就是你所追求的,那么你可以通过这样定义f来完成它:

def f(setter: Int => Unit) = setter(12)

...然后像这样传递m上的setter:

f(m.y_=)

如果m是Y的新实例,那么这将导致y被设置为12.在上面的片段中,m.y_ =被认为是函数值。传入后,您可以使用参数名称setter引用该函数。由于它是一个函数,你可以通过传递它所期望的参数来应用它,这是一个Int类型的值。

答案 2 :(得分:1)

class Y(var y : Int = 0)

完成这项工作。