我的代码如下:
case class SRecord(trialId: String, private var _max:Int) {
def max=_max
def max_=(value:Int):Unit=_max=value
}
然后我将一个函数应用到它上面:
def groupSummaryRecords(it:Iterator[Option[SRecord]], optionSummary:Option[SRecord]):Option[SRecord] = {
var max=0;
var sRecord1 : Option[SRecord] = None
var i=0
while(it.hasNext) {
var sRecord:Option[SRecord] = it.next();
if(i==0) {
sRecord1 = sRecord;
}
..
}
sRecord1.max=max; // getting 'reassignment to val' compilation error
..
}
为什么我会收到此编译错误,以及如何解决此问题?
如果我改为将sRecord和sRecord1实例更改为类型SRecord
而不是Option[SRecord]
以及方法签名,那么一切正常。
但在某些情况下,我可能会使用SRecord
,因此使用None/Some
。我是Scala的新手,使用Option/Some
如果你问我,感觉真的很痛苦,我只是想删除所有这些Option
废话,并在好的Java中测试'null',至少我的代码会工作??!
答案 0 :(得分:5)
使用行sRecord1.max=max
,您尝试在max
上调用Option[SRecord]
方法,而不是SRecord
。您想要访问包含的SRecord
(如果有的话)并调用该方法,这可以使用foreach来完成:
sRecord1.foreach(_.max=max)
对于:
sRecord1.foreach( srec => srec.max=max )
(实际名称" srec"组成,编译器将分配一些内部名称,但你明白了)。如果sRecord1
为None
,则不会执行任何操作,但如果为Some(srec)
,则会传递方法执行以对包含的实例进行操作。