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

时间:2019-04-26 09:12:58

标签: scala implicit

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

Figure

我想遍历此列表并生成如下函数:

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

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

有什么想法吗?我可以使用宏吗?

2 个答案:

答案 0 :(得分:4)

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

隐式名称无关紧要,其类型无关紧要。

答案 1 :(得分:0)

因此,即使看起来很丑,这也是一个可行的实现!

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
  }