2015-06-02 4 views
0

Я получаю эту ошибку при компиляции:Неожиданная ошибка: Перераспределение ВАЛ

Compilation error: reassignment to val 

Я думаю, что это кажется очевидным, но при взгляде на моем коде я не могу найти, почему это не работает.

Вот пример кода, где происходит ошибка, из моего 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) 
     } 
     ... 
    } 
} 

Переменные в Conference.scala объявлены как следующие:

case class Conference (
    id   : Long, 
    title  : String, 
    abstr  : String, 
    speaker : Speaker, 
    startDate : DateTime, 
    length  : Duration, 
    organizedBy: Lab, 
    location : Location, 
    accepted : Boolean, 
    acceptCode : Option[String], 
    priv  : Boolean, 
    forGroup : Option[LabGroup]=None 
) {... Functions ...} 

функции называют это из файла 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 тоже должен быть одним.

Если вы видите что-то не так, сообщите мне.

Спасибо за помощь.

ответ

4

При создании экземпляра класса дела, как вы сделали, каждый член этого является a val по умолчанию. Вы должны явно сказать Scala, что хотите иметь его как var. Просто сделайте это так:

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

EDIT:
Как Régis Jean-Gilles писал в своем комментарии, более идиоматических способ изменения значения forGroup бы этот код:

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

Это оставит forGroup как Значение и является лучшим [функциональным] способом выполнения «переназначений».

+6

Вы также можете просто использовать 'copy':' newConf = newConf .copy (forGroup = LabGroup.findById (groupId.get)) '. Это, наверное, лучше и более идиоматично (но в конце концов только ОП может сказать, что лучше для него/нее). –

+0

Это хорошо работает, спасибо. Régis ваше решение тоже приятно и выполняет эту работу, я возьму его, чтобы конференция была как есть. – Calaom

5

var newConf = Conference.findById(confId).get определяет переменную newConf. Эта переменная может быть переназначена. Однако значение forGroup от newConf по-прежнему является именно этим значением и поэтому его нельзя изменить.

Если вы хотите обновить forGroup для newConf, то она должна быть объявлена ​​переменная, которую вы можете сделать с:

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

Спасибо за ответ @Marth – Calaom

Смежные вопросы