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
)