如何在带有可选参数的函数上区分大小写

时间:2019-06-20 13:06:45

标签: scala parameters pattern-matching anonymous-function

我希望能够有一个带有可选参数的方法。当存在该可选参数时,它将调用特定的数据库查询,该查询返回使用该可选参数过滤的记录。如果该可选参数不存在,我希望它调用一个不按该可选参数过滤的数据库查询。

第一个查询尚未编写,但具有相同的返回结构和类型。编写第二个查询,并且在没有可选参数和大小写的情况下可以正常工作。

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]]] = {

                              ^

有人可以向我解释该错误是什么意思吗?以及如何设计我想要的方法来工作?

注意:该方法的一些细节已被省略。本质上,它只返回返回类型的记录,以及其中一个查询获取的数据。

1 个答案:

答案 0 :(得分:2)

当然,请发表您的评论:

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是反引号,因为它是一个关键字。如果您使用非关键字名称,则不需要反引号。