Создать динамическое имя функции на лету в Scala - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть объект, в котором у меня есть куча неявных функций.Теперь я хочу, чтобы некоторые значения были определены для нескольких форматов дат: Например,

val dateFormats = Seq("dd/MM/yyyy", "dd.MM.yyyy")

Я хочу просмотреть этот список и сгенерировать такую ​​функцию:

  dateFormats foreach {
    case dateFormat =>
      implicit def ???: CsvFieldReader[DateTime] = (s: String) => Try {
        DateTimeFormat.forPattern(dateFormat).parseDateTime(s)
      }
  }

Какможно разрешить имя функции?Я хочу, чтобы имя функции было уникальным для каждой записи в списке!

Есть идеи?Могу ли я сделать это с макросами?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2019

Если вы создадите несколько последствий одного и того же типа CsvFieldReader[DateTime], они сделают неоднозначность, а последствия не разрешатся.

Имена имплицитов не имеют значения ( почти ), их типы имеют значение.

0 голосов
/ 26 апреля 2019

Итак, вот реализация, которая работает, хотя и выглядит ужасно!

implicit def dateTimeCSVConverter: CsvFieldReader[DateTime] = (s: String) => Try {
    dateFormats.map {
      case format => try {
        Some(DateTimeFormat.forPattern(format).parseDateTime(s))
      } catch {
        case _: IllegalArgumentException =>
          println(s"Date format $format incompatible, will try the next available format")
          None
      }
    }.distinct.collectFirst {
      case elem if elem.isDefined => elem.get
    }.get
  }
...