2

これを何と呼ぶか​​わからない、オプションはどちらかと同じように適合します、私は関係なく3番目のケースを処理する必要があります。

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

私はそれをすべて一緒に取得することができましたが、少しクリーンアップしたいと思います。操作はユーザーまたはユーザーとしての管理者のケースに関係なく同じです。

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 に答える