Как сопоставить регистр в функции с дополнительными параметрами - PullRequest
0 голосов
/ 20 июня 2019

Я хочу иметь возможность иметь метод с необязательным параметром.Когда этот необязательный параметр присутствует, он вызывает конкретный запрос БД, который возвращает записи, отфильтрованные с помощью необязательного параметра.Если этот необязательный параметр отсутствует, я хочу, чтобы он вызывал другой запрос к БД, который не фильтруется по необязательному параметру.

Первый запрос еще не написан, но будет иметь такую ​​же структуру и типы возврата.Второй запрос написан, и работает нормально без необязательного параметра и случаев.

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 Ответ

2 голосов
/ 20 июня 2019

Re ваш комментарий, конечно, здесь вы идете:

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 стоит в обратном порядке, потому что это ключевое слово. Если вы используете имя без ключевого слова, обратные пометки вам не понадобятся.

...