我寫了一個簡單的隱式函數: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的一個例子。 –