2

不知道该怎么称呼它,Option 和 Either 一样合适,无论如何我都需要处理第三种情况。

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) )

我可以 getOrElse 这一切,但更愿意清理一下,无论用户或管理员作为用户的情况,操作都是相同的。

4

1 回答 1

10

不是 getOrElse,只是 orElse

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) ) 
于 2012-07-12T00:17:51.080 回答