gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:59:04 25 4
gpt4 key购买 nike

我有这段代码和一些讨厌的嵌套检查......

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

// 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")
}

}

你能给我什么提示吗?

最佳答案

只需在 for 中使用提取器,您就可以去除很多残留物。 -理解:

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

但在我看来,以下内容更简洁、更清晰:
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")

不过,这两者本质上是等价的——在这两种情况下,您只是从 Option 中取出值(如果存在)。并查看它是否与正则表达式匹配。

关于scala:如何使用 for comprehension 重写此函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13143297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com