scala Обработка Either & Neither

Не уверен, как это назвать, вариант подойдет так же хорошо, как и Либо, мне все равно нужно обработать третий случай.

Scalaz, вероятно, уже предоставляет что-то подобное, но мне любопытно узнать, как без отдельной библиотеки можно кратко справиться со следующим простым случаем:

Мне нужно проверить, существует ли пользовательский сеанс, как фактический пользователь, так и администратор, входящие в систему как пользовательские сценарии, причем последний имеет приоритет над первым; если ни одно из условий не существует, показать экран входа в систему.

Фактическая проверка сеанса пользователя выглядит так:

request.session.get(Security.username) map { id=>
  f(Success(id.toInt, request)) 
} getOrElse( onFail(request) ) // onFail = show login

и мне нужно добавить в админ, выдающий себя за пользователя:

request.session.get(Security.impersonate) map { id=>
  f(Success(id.toInt, request)) 
} getOrElse( onFail(request) )

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


person virtualeyes    schedule 12.07.2012    source источник


Ответы (1)


Не получить, просто или иначе

scala> val userName : Option[String] = None
userName: Option[String] = None

scala> val impersonate = Some("Fred")
impersonate: Some[java.lang.String] = Some(Fred)

scala> userName orElse impersonate
res0: Option[String] = Some(Fred)

scala> val userName = Some("George")
userName: Some[java.lang.String] = Some(George)

scala> userName orElse impersonate
res1: Option[java.lang.String] = Some(George)

Так что в вашем случае

request.session.get(Security.username) orElse request.session.get(Security.impersonate) map { id=>
  f(Success(id.toInt, request)) 
} getOrElse( onFail(request) ) 
person James Iry    schedule 12.07.2012