我的代码看起来像:
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',至少我的代码会工作??!
使用该行,sRecord1.max=max
您尝试在a上调用max
方法Option[SRecord]
,而不是SRecord
.您想要访问包含的SRecord
(如果有的话)并在其上调用方法,这可以使用foreach完成:
sRecord1.foreach(_.max=max)
这是为了:
sRecord1.foreach( srec => srec.max=max )
(实际名称"srec"组成,编译器将分配一些内部名称,但你明白了).如果sRecord1
是None
,这将不会执行任何操作,但如果是Some(srec)
,则将传入方法执行以对包含的实例进行操作.