Аргумент модели не переменного типа. Пользователь в шаблоне типа Опция [models.User] не проверяется, поскольку она удаляется удалением - PullRequest
0 голосов
/ 04 апреля 2020

Этот код проверяет, существует ли User и, соответственно, либо возвращает User, либо выдает исключение

 def confirmSignupforUser(user:User):Future[User] = {
    val newInternalProfile = user.profile.internalProfileDetails.get.copy(confirmed=true)
    val newProfile = UserProfile(Some(newInternalProfile),user.profile.externalProfileDetails)
    val confirmedUser = user.copy(profile=newProfile)
    for(userOption <- userRepo.update(confirmedUser)) yield {
      userOption match {
        case Some(user) => user
        case None => throw UserDoesNotExistException("userNotExist",new Throwable("userNotExist"))
      }
    }
  }

Если я вызываю код следующим образом, я получаю ошибку non-variable type argument models.User in type pattern Option[models.User] is unchecked since it is eliminated by erasure для строки modifiedUser:Option[User] <- if (userOption.isDefined) {confirmSignupforUser(userOption.get)} else Future.successful(None) Почему?

       val result:Future[Result] = for{tokenOption:Option[UserToken] <- if(host != "" && redirectUrl != "" && successUrlParameter != "" && failUrlParameter != "") { userTokenRepo.findOne(UserTokenKey(UUID.fromString(token)))} else {Future.successful(None)}  
                                    userOption:Option[User] <- if (tokenOption.isDefined) {userRepo.findOne(tokenOption.get.userKeys)} else {Future.successful(None)} 
                                    modifiedUser:Option[User] <- if (userOption.isDefined) {confirmSignupforUser(userOption.get)} else Future.successful(None) 
                                    deletedToken:Option[UserTokenKey] <- if(modifiedUser.isDefined) {userTokenRepo.delete(UserTokenKey(UUID.fromString(token)))} else Future.successful(None)

       }
         yield { 
...
}

1 Ответ

0 голосов
/ 05 апреля 2020

Вы получаете непроверенную ошибку, потому что один из ваших операторов if-else имеет неправильный тип в результате блока.

ПРИМЕЧАНИЕ: этот метод возвращает Future[User]

def confirmSignupforUser(user:User):Future[User] = ???

но вы получаете ошибку компиляции в том, что else оператор возвращает Future[Option[User]]. Я бы предложил выровнять это если еще заявление. Вы можете либо изменить свой метод, чтобы вернуть Future[Option[User]] ИЛИ вы можете изменить, если деталь выглядит следующим образом:

confirmSignupforUser(userOption.get).map(Some(_))

Итак, ломаная линия может быть определена так:

for {
    modifiedUser: Option[User] <- if (userOption.isDefined) {
            confirmSignupforUser(userOption.get).map(Some(_))
    } else Future.successful(None)
}

вы можете запустить его здесь как простую демонстрацию

ИМХО, лучше go с OptionT здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...