我写了一个简单的隐式函数:mkString()的一个版本工作原理相同,但如果在连接的任何参数中都找到分隔符,则会引发错误。我想,使其工作在所有序列状的东西,所以我声明,如下所示:Scala 2.10在TraversableOnce上的隐式函数应该接受一个数组,但不会
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)
}
}
}
这工作对大多数的对象,但在斯卡拉2.10 Array[String]
类型的东西失败。这是因为Scala中的数组只是Java数组的别名,并不会从TraversableOnce
继承。但是,存在从Array
到WrappedArray
的隐式转换,即确实从TraversableOnce
继承。 Scala中有一些规则不允许从A→B然后从B→C进行隐式转换?除了手动创建另一个隐式类,明确应用safeMkString
从Array[T]
以外,有什么方法可以实现此工作吗?
Doh,这确实是RTFM的一个例子。 –