ich eine einfache implizite Funktion schrieb: eine Version von mkString(), die funktioniert identisch, aber wirft einen Fehler, wenn der Separator gefunden wird in einem der Argumente verbunden werden. Ich möchte es alle sequenz wie die Dinge funktionieren über, so erklärte ich es wie folgt:Scala 2.10 implizite Funktion über TraversableOnce sollte ein Array akzeptieren, aber nicht
object SafeMkString {
implicit class SafeMkStringHelper[T](values: TraversableOnce[T]) {
def safeMkString(sep: String) = {
values.map { v =>
val asStr = v.toString
if (asStr.contains(sep))
throw new IllegalArgumentException("Value %s in %s contains separator %s" format
(asStr, values, sep))
else
asStr
}.mkString(sep)
}
}
}
Dies funktioniert für die meisten Objekte in Ordnung, aber nicht in Scala 2.10 mit etwas vom Typ Array[String]
. Dies liegt daran, dass Arrays in Scala einfach Aliase von Java-Arrays sind und nicht von TraversableOnce
erben. Allerdings gibt es eine implizite Konvertierung Array
-WrappedArray
die tut vererben TraversableOnce
. Gibt es eine Regel in Scala, die eine implizite Umwandlung von A -> B und dann von B -> C nicht zulässt? Gibt es irgendeine Weise, die ich diese Arbeit anderen bekommen können als manuell eine andere implizite Klasse erstellen, die explizit safeMkString
von Array[T]
gilt?
Doh, das ist wirklich ein Fall von RTFM. –