Ich mag wäre ziemlich Druck auf ein Product
, wie ein case class
, so dass ich erstellen Sie das folgende Merkmal:dynamischen String-Interpolation
trait X extends Product {
def fmtStrs =
productIterator map {
case _ : Double => "%8.2f"
case _ => "%4s"
} map (_ + separator) toSeq
override def toString = {
new StringContext("" +: fmtStrs : _*) f (productIterator.toSeq : _*)
}
}
Diese verwendet String-Interpolation, wie in der ScalaDoc für StringContext beschrieben.
Aber dies wird nicht kompiliert, mit diesem kryptischen Fehler:
Error:(69, 70) too many arguments for interpolated string
new StringContext("" +: fmtStrs : _*) f (productIterator.toSeq : _*)
Ist das ein Bug oder Einschränkung eines Makros? Beachten Sie, dass die folgenden funktioniert gut tun, so dass ich vermute, dies ist auf die Variable Argumentliste in Beziehung gesetzt werden kann:
scala> val str2 = StringContext("","%4s,","%8.2f").f(1,23.4)
str2: String = " 1, 23.40"
Eher bizarr, wenn Sie den "f" Interpolator in den "s" Interpolator ändern, scheint dies zu funktionieren (und funktioniert) ... – Luciano