在 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
}
我有一个对象,其中有一堆隐式函数。我现在想为几种日期格式定义一些隐式:例如,
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
}