我希望能够编写以下代码段:
val Converter = converter"const1:$F;array:$AF"
val styleinput = "const1:1.2;const2:4.5,3,5,0;end"
val Converter(float1, array) = styleinput
// ... Use float1 = 1.2 and array= {4.5,3,5,0}
val styleoutput = Converter(float1, array)
assert(styleoutput == styleinput)
它更简单地取代Parser combinators,在我的情况下更有用,因为我可以使用相同的表达式来读取和写入字符串中的日期。
对于转换部分,我编写了一个带有自定义函数的隐式类,类似于组合器。
def F = FloatConverter() // Extends Converter1[Float]
def AF = RepConverter(F, ",") // Extends Converter1[List[Float]]
implicit class ParserImplicit(sc: StringContext) {
def converter[A](arg1: Converter1[A]) = {
<##(##>(Const(sc.parts(0)), arg1), Const(sc.parts(1)))
}
def converter[A, B](arg1: Converter1[A], arg2: Converter1[B]): ConverterSeq[A, B] = {
###(<##(##>(Const(sc.parts(0)), arg1), Const(sc.parts(1))), <##(arg2, Const(sc.parts(2))))
}
}
但这很复杂。是否有更简单的方法来编写上面的代码,尤其是converter"...."
,以便我仍然可以使用unapply并以类似的方式应用?