如何对具有可选参数的函数进行大小写匹配
How to case match on a function with optional parameters
我希望能够有一个带有可选参数的方法。当该可选参数存在时,它将调用特定的数据库查询,该查询使用可选参数过滤了 returns 记录。如果该可选参数不存在,我希望它调用不按可选参数过滤的不同数据库查询。
第一个查询尚未编写,但具有相同的 return 结构和类型。第二个查询已编写,并且在没有可选参数和案例的情况下也能正常工作。
def getRecords(id: String, type: String = ""): Future[List[Set[String]]] = {
case Some(type) =>
val query =>
s"""
| ...
""".stripMargin
case _ =>
val query =>
s"""
| ...
""".stripMargin
record = get(dbResult).asList.asScala.map(_.toString).toSet
}
我收到的错误是
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: scala.concurrent.Future[List[Set[String]]]
: Future[List[Set[String]]] = {
^
有人可以向我解释错误的含义吗?以及如何设计我的方法以按照我希望的方式工作?
注意:省略了部分方法细节。它本质上只是 returns return 类型的记录以及其中一个查询获取的任何数据。
回复你的评论,好的,给你:
def getRecords(id: String, `type`: Option[String] = None): Future[List[Set[String]]] = {
val matchResult = `type` match {
case Some(t) => //t is your string
val query =
s"""
| ...
""".stripMargin
//do something with your query val
case _ =>
val query =
s"""
| ...
""".stripMargin
//do something with your query val
}
//use your matchResult here, whatever that ends up being
//not sure how this works but just copied from your question:
get(dbResult).asList.asScala.map(_.toString).toSet
}
显然您必须在某处使用 query
,但我假设您只是将其简化了。如果您担心空字符串,您可以在第一个 case 子句中添加一个守卫:case Some(t) if t.nonEmpty => ...
。 type
被反引号括起来,因为它是关键字。如果您使用 non-keyword 名称,则不需要反引号。
我希望能够有一个带有可选参数的方法。当该可选参数存在时,它将调用特定的数据库查询,该查询使用可选参数过滤了 returns 记录。如果该可选参数不存在,我希望它调用不按可选参数过滤的不同数据库查询。
第一个查询尚未编写,但具有相同的 return 结构和类型。第二个查询已编写,并且在没有可选参数和案例的情况下也能正常工作。
def getRecords(id: String, type: String = ""): Future[List[Set[String]]] = {
case Some(type) =>
val query =>
s"""
| ...
""".stripMargin
case _ =>
val query =>
s"""
| ...
""".stripMargin
record = get(dbResult).asList.asScala.map(_.toString).toSet
}
我收到的错误是
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: scala.concurrent.Future[List[Set[String]]]
: Future[List[Set[String]]] = {
^
有人可以向我解释错误的含义吗?以及如何设计我的方法以按照我希望的方式工作?
注意:省略了部分方法细节。它本质上只是 returns return 类型的记录以及其中一个查询获取的任何数据。
回复你的评论,好的,给你:
def getRecords(id: String, `type`: Option[String] = None): Future[List[Set[String]]] = {
val matchResult = `type` match {
case Some(t) => //t is your string
val query =
s"""
| ...
""".stripMargin
//do something with your query val
case _ =>
val query =
s"""
| ...
""".stripMargin
//do something with your query val
}
//use your matchResult here, whatever that ends up being
//not sure how this works but just copied from your question:
get(dbResult).asList.asScala.map(_.toString).toSet
}
显然您必须在某处使用 query
,但我假设您只是将其简化了。如果您担心空字符串,您可以在第一个 case 子句中添加一个守卫:case Some(t) if t.nonEmpty => ...
。 type
被反引号括起来,因为它是关键字。如果您使用 non-keyword 名称,则不需要反引号。