Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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 - Fatal编程技术网

Scala 意外错误:重新分配到val

Scala 意外错误:重新分配到val,scala,Scala,我在编译时遇到此错误: Compilation error: reassignment to val 我认为这似乎是显而易见的,但当查看我的代码时,我无法找到为什么这不起作用 以下是发生错误的代码示例,来自my ConferenceController.scala: def createConfWithPrivacy(confId: Long, groupId: Option[Long]) = ForcedAuthentication {implicit request =>

我在编译时遇到此错误:

Compilation error: reassignment to val
我认为这似乎是显而易见的,但当查看我的代码时,我无法找到为什么这不起作用

以下是发生错误的代码示例,来自my ConferenceController.scala:

def createConfWithPrivacy(confId: Long, groupId: Option[Long]) = ForcedAuthentication 
{implicit request =>
    Future {
      val user = request.user.get
      var newConf = Conference.findById(confId).get
      if(groupId.isDefined){
        newConf.forGroup = LabGroup.findById(groupId.get)  <- there it is
        Conference.updateForGroup(newConf)
      }
      ...
    }
}
调用的函数来自LabGroup.scala文件,我知道这一个可以工作:

def findById(id: Long): Option[LabGroup] = DB.withConnection { implicit  c =>
    SQL("SELECT * FROM LabGroup WHERE id = {id}")
      .on("id" -> id)
      .as(labGroupParser.singleOpt)
  }
但是我不明白为什么会发生这个错误,因为newConf是一个var,通常Conference.forGroup也应该是一个

如果你看到有什么事情做错了,请告诉我


感谢您的帮助。

var newConf=Conference.findById(confId).get定义变量
newConf
。可以重新分配此变量。但是,
newConf
forGroup
值仍然只是一个值,因此不能更改

如果要为
newConf
更新
forGroup
,则需要将其声明为变量,您可以使用:

case class Conference (
    id         : Long,
    // ...
    var forGroup   : Option[LabGroup]=None
)

当您像前面那样实例化一个case类时,默认情况下,它的每个成员都是val。您必须明确地告诉Scala您希望将其作为var使用。就这样做吧:

case class Conference (
    id         : Long,
    ...
    var forGroup   : Option[LabGroup]=None
)
编辑:
如他在评论中所述,更改组的值的更惯用方法是以下代码:

newConf.forGroup=newConf.copy(forGroup=LabGroup.findById(groupId.get))


这将把forGroup作为一个,是一种更好的[功能性]进行“重新分配”的方法

您也可以只使用
copy
newConf=newConf.copy(forGroup=LabGroup.findById(groupId.get))
。这可以说更好,更地道(但最后只有OP能告诉他/她什么对他/她最好)。它很有效,非常感谢。雷吉斯:你的解决方案也很好,而且也做得很好,我会让会议保持现状。谢谢你的回答@Marth
case class Conference (
    id         : Long,
    ...
    var forGroup   : Option[LabGroup]=None
)