在 Scala 中即时创建动态函数名称

Create dynamic function name on the fly in Scala

我有一个对象,其中有一堆隐式函数。我现在想为几种日期格式定义一些隐式:例如,

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)
      }
  }

如何解析函数名?我希望函数名称对于列表中的每个条目都是唯一的!

有什么想法吗?我可以用宏来做到这一点吗?

如果您创建多个相同类型的隐式 CsvFieldReader[DateTime] 它们会产生歧义并且隐式将无法解析。

隐含的名称无关紧要 (almost),它们的类型很重要。

所以,这是一个有效的实现,尽管它看起来很丑陋!

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
  }