如何对具有可选参数的函数进行大小写匹配

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 名称,则不需要反引号。