Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala在选项类中重新分配给val_Scala_Optional_Nonetype - Fatal编程技术网

scala在选项类中重新分配给val

scala在选项类中重新分配给val,scala,optional,nonetype,Scala,Optional,Nonetype,我的代码如下所示: 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]):

我的代码如下所示:

    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
废话,并在好的ol'Java中测试'null',至少我的代码可以工作

使用行
sRecord1.max=max
尝试调用
选项[SRecord]
上的
max
方法,而不是
SRecord
。您想访问包含的
SRecord
(如果有)并调用该记录上的方法,可以使用foreach:

sRecord1.foreach(_.max=max)
其目的是:

sRecord1.foreach( srec => srec.max=max )

(实际的名称“srec”是由编造的,编译器将分配一些内部名称,但您可以理解)。如果
sRecord1
None
,这将不起任何作用,但是如果它是
Some(srec)
,将传入方法执行以对包含的实例进行操作。

使用
sRecord1.max=max
行尝试调用
选项[SRecord]
上的
max
方法,不是
SRecord
。您想访问包含的
SRecord
(如果有)并调用该记录上的方法,可以使用foreach:

sRecord1.foreach(_.max=max)
其目的是:

sRecord1.foreach( srec => srec.max=max )

(实际的名称“srec”是由编造的,编译器将分配一些内部名称,但您可以理解)。如果
sRecord1
None
,这将不起任何作用,但是如果它是
Some(srec)
,则将传入方法执行以对包含的实例进行操作。

您在这里试图做什么?一般提示:避免具有可变状态(vars)的case类--只需将其设置为常规类,除非您真的想对其进行模式匹配。不要使用null。也许读这篇文章会有助于解决您在使用Option时遇到的问题谢谢,我已经读过这篇文章了,但对这个问题没有帮助;好的@RobStarling,我想使用case类会自动定义我的getter方法,所以这会很有帮助。@matthieulieber你确实得到了很好的好处,但你也会得到奇怪的副作用,像
=
忽略可变位的比较。您在这里尝试做什么?一般提示:避免使用具有可变状态(vars)的case类——只需将其设置为常规类,除非您确实希望对其进行模式匹配。不要使用null。也许读这篇文章会有助于解决您在使用Option时遇到的问题谢谢,我已经读过这篇文章了,但对这个问题没有帮助;好的@RobStarling,我想使用case类会自动定义我的getter方法,所以这会很有帮助。@matthieulieber你确实得到了很好的好处,但你也会得到奇怪的副作用,比如忽略可变位的比较。