Сопоставление шаблонов с вложенными шаблонами - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть эти структуры данных с классом case в опции и полем, заключенным в опцию:

case class Name(value: Option[String]) extends AnyVal
case class Data(id: Int, name: Option[Name], isDefault: Boolean)

Так что я бы хотел обработать случаи, когда есть некоторые для Name,То же самое касается верхнего варианта. Но когда для Имени есть None, я бы хотел получить None вместо Some(Name(None)). Я попытался сделать что-то вроде этого:

def handleNestedOptions(value: Option[String]): Option[Name] = {
  value match {
    case Some(data) => Some(Name(Some(data)))
    case None => None
  }
}

Но я также хотел бы иметь его в общем виде, чтобы он мог работать для любого класса дел той же структуры, что и у меня. Итак, как я могу изменить эту реализацию, чтобы сделать ее более общей? Под общим я имею в виду что-то вроде этого: def handleNestedOptions[T, K](value: Option[K]): Option[T]

1 Ответ

3 голосов
/ 11 ноября 2019

Вот один из способов.

def handleNestedOptions[T,U](value :Option[T], f :Option[T]=>U) :Option[U] =
  if (value.isEmpty) None
  else Option(f(value))

handleNestedOptions(None, Name)        //res0: Option[Name] = None
handleNestedOptions(Some("str"), Name) //res1: Option[Name] = Some(Name(Some(str)))
...