加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala:如何使用for comprehert重写此函数

发布时间:2020-12-16 18:03:50 所属栏目:安全 来源:网络整理
导读:我有一些代码与几个讨厌的嵌套检查… 我很确定它可以用一个很好的理解来重写,但我对如何混合模式匹配的东西有点困惑 // first tries to find the token in a header: "authorization: ideas_token=xxxxx"// then tries to find the token in the querystring
我有一些代码与几个讨厌的嵌套检查…

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

// 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_tokens*=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_tokens*=s*(w+)s*$""".r

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

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

但是我的眼睛更简洁,更清晰一点:

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

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

这两者本质上是等价的,但在这两种情况下,你只是将值(如果存在)拉出Option并查看它是否与正则表达式匹配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读