значение не найдено в операции фильтра / карты - PullRequest
1 голос
/ 10 ноября 2011

Как мне изменить следующий фрагмент кода, чтобы переменная «попытки» была известна в функции handleFailure?

def getLoginAttempts(username: String): Option[Long] = ...

getLoginAttempts(username) filter (attempts => attempts <= MAX_ATTEMPTS) map {
    handleFailure(username, attempts)
} orElse sendNotification()

вывод компилятора => не найден: попытки попытки

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Почему бы просто:

getLoginAttempts(username) filter (attempts => attempts <= MAX_ATTEMPTS) map { attempts =>
    handleFailure(username, attempts)
} orElse sendNotification()

Или, может быть, я не понимаю, что такое handleFailure?

2 голосов
/ 10 ноября 2011

Это было бы более четко выражено при сопоставлении с образцом.

getLoginAttempts(username) match {
  case Some(attempts) if attempts <= MAX_ATTEMPTS => handleFailure(username, attempts)
  case _ => sendNotification()
}

Позже это также облегчает задачу, если вы хотите отличить корпус None от корпуса Some(attempts), attempts > MAX_ATTEMPTS. ИМХО, сопоставление с образцом менее неясно, чем filter и map для значений Option, которые просто выполняют сопоставление за кулисами.

1 голос
/ 10 ноября 2011

Как:

val attempts = getLoginAttempts(username).getOrElse(0)
if(attempts >= MAX_ATTEMPTS) handleFailure(username, attempts) else sendNotifications()
...