【发布时间】:2019-06-20 13:06:45
【问题描述】:
我希望能够有一个带有可选参数的方法。当存在该可选参数时,它将调用特定的数据库查询,该查询返回使用可选参数过滤的记录。如果该可选参数不存在,我希望它调用不按可选参数过滤的不同数据库查询。
第一个查询尚未编写,但将具有相同的返回结构和类型。编写了第二个查询,并且在没有可选参数和案例的情况下可以正常工作。
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]]] = {
^
有人可以向我解释错误的含义吗?以及如何设计我的方法以按照我想要的方式工作?
注意:该方法的一些细节已被省略。它本质上只是返回返回类型的记录以及其中一个查询获取的任何数据。
【问题讨论】:
-
def getRecords(id: String, `type`: Option[String] = None): Future[List[Set[String]]] = `type` match { case Some(t) => ...; case _ => ... }。注意t这里将是你的字符串,如果它存在的话。 -
一个简单的选择是有两个重载版本的函数,一个有一个参数,一个有两个参数。
-
正如@Lasf 提到的,
type是反向关键字,您不应该使用它。如果真的需要,那么你可以使用 ` -
@Lasf 你能提供一个答案吗?我不能很好地阅读它。此外,如果它有效(它似乎是答案,如果不是非常接近)我会将其标记为正确。
-
@Tim 感谢您的评论。我可以重载,但是代码库的结构是这样设计的,即我不仅要添加一个方法,而且基本上是方法的两倍,所以我试图在一个中完成它。我可能不应该在我的例子中使用它。在我的实际方法中,它不被称为“类型”。我不得不更改/省略细节。
标签: scala parameters pattern-matching anonymous-function