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"是编造的,编译器会分配一些内部名称,但你明白了)。如果sRecord1None,这不会做任何事情,但是如果是Some(srec),方法执行将被传递到对包含的实例进行操作。