【发布时间】:2015-05-13 15:44:07
【问题描述】:
我开始学习伟大的 Scala 语言并且对“深度”模式匹配有疑问
我有一个简单的Request 类:
case class Request(method: String, path: String, version: String) {}
还有一个函数,它会尝试匹配 request 实例并构建相应的响应:
def guessResponse(requestOrNone: Option[Request]): Response = {
requestOrNone match {
case Some(Request("GET", path, _)) => Response.streamFromPath(path)
case Some(Request(_, _, _)) => new Response(405, "Method Not Allowed", requestOrNone.get)
case None => new Response(400, "Bad Request")
}
}
看,我在case 语句中使用requestOrNone.get 来获取动作Request 对象。它类型安全吗,因为case 语句匹配?我觉得有点丑。是否可以从Some“解包”Request 对象,但仍然能够匹配Request 类字段?
如果我想在带有局部变量等的case 内进行复杂计算怎么办...我可以在case 语句之后使用{} 块吗?我使用带有官方 Scala 插件的 IntelliJ Idea,它会突出显示我的括号,建议删除它们。
如果可能的话,将匹配项包含在匹配项中是否是一种好习惯?
... match {
case Some(Request("GET", path, _)) => {
var stream = this.getStream(path)
stream match {
case Some(InputStream) => Response.stream(stream.get)
case None => new Response(404, "Not Found)
}
}
}
【问题讨论】: