scala 在 Option Class 中重新分配给 val
scala reassignment to val in Option Class
我的代码如下:
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
废话并测试 'null' 在 good ol' Java,至少我的代码可以工作??!
在行 sRecord1.max=max
中,您试图在 Option[SRecord]
而不是 SRecord
上调用 max
方法。你想访问包含的 SRecord
(如果有的话)并调用方法,这可以使用 foreach:
sRecord1.foreach(_.max=max)
脱糖为:
sRecord1.foreach( srec => srec.max=max )
(实际名称"srec"是编造的,编译器会分配一些内部名称,但你明白了)。如果sRecord1
是None
,这不会做任何事情,但是如果是Some(srec)
,方法执行将被传递到对包含的实例进行操作。
我的代码如下:
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
废话并测试 'null' 在 good ol' Java,至少我的代码可以工作??!
在行 sRecord1.max=max
中,您试图在 Option[SRecord]
而不是 SRecord
上调用 max
方法。你想访问包含的 SRecord
(如果有的话)并调用方法,这可以使用 foreach:
sRecord1.foreach(_.max=max)
脱糖为:
sRecord1.foreach( srec => srec.max=max )
(实际名称"srec"是编造的,编译器会分配一些内部名称,但你明白了)。如果sRecord1
是None
,这不会做任何事情,但是如果是Some(srec)
,方法执行将被传递到对包含的实例进行操作。