scala:如何使用重写此函数以便于理解

scala:如何使用重写此函数以便于理解,scala,for-comprehension,Scala,For Comprehension,我有一段代码,里面有几个讨厌的嵌套检查 我很确定它可以用一个很好的解释来重写,但是我对如何混合模式匹配的东西有点困惑 // first tries to find the token in a header: "authorization: ideas_token=xxxxx" // then tries to find the token in the querystring: "ideas_token=xxxxx" private def applicationTokenFromReques

我有一段代码,里面有几个讨厌的嵌套检查

我很确定它可以用一个很好的解释来重写,但是我对如何混合模式匹配的东西有点困惑

// first tries to find the token in a header: "authorization: ideas_token=xxxxx"
// then tries to find the token in the querystring: "ideas_token=xxxxx"
private def applicationTokenFromRequest(request: Request[AnyContent]): Option[String] = {

  val fromHeaders: Option[String] = request.headers.get("authorization")
  val tokenRegExp = """^\s*ideas_token\s*=\s*(\w+)\s*$""".r

  val tokenFromHeader: Option[String] = {
    if (fromHeaders.isDefined) {
      val header = fromHeaders.get
      if (tokenRegExp.pattern.matcher(header).matches) {
        val tokenRegExp(extracted) = header
        Some(extracted)
      } else {
        None
      }
    } else {
      None
    }
  }

  // try to find it in the queryString
  tokenFromHeader.orElse {
    request.queryString.get("ideas_token")
  }

}

你能给我什么提示吗?

你只需使用
中的提取器,就可以去除很多积垢,以便理解:

val Token = """^\s*ideas_token\s*=\s*(\w+)\s*$""".r

val tokenFromHeader = for {
  Token(t) <- request.headers.get("authorization")
} yield t

tokenFromHeader orElse request.queryString.get("ideas_token")

这两者本质上是等价的,尽管在这两种情况下,您只是从
选项中提取值(如果存在),然后查看它是否与正则表达式匹配。

在代码检查中可能会更好site@NoelM:这个问题需要的是具体的建议,而不仅仅是代码审查。谢谢travis,一个问题,大写reg exp类是一种好的样式吗?@opensas:在这种情况下(我相信在2.8之前),它是必要的,是的,我个人认为当你使用
Regex
作为提取器时,它是一种好的样式(我是)。
val Token = """^\s*ideas_token\s*=\s*(\w+)\s*$""".r

request.headers.get("authorization") collect {
  case Token(t) => t
} orElse request.queryString.get("ideas_token")