这是我的存根:
def transform[S[T]<: GenIterableLike[T,S[T]],T](s:S[T])
(implicit bf:CanBuildFrom[S[T],(T,Int),S[(T,Int)]]):S[(T,Int)] = {
s.zipWithIndex
}
T
签名很糟糕,通过替换它可能会稍微简化(或模糊)_
。
试一试:
scala> val m = Map("x"->"1","y"->"2")
m: scala.collection.Map[String,String] = Map(x -> 1, y -> 2)
scala> transform(m)
res3: Iterable[((String, String), Int)] = List(((x,1),0), ((y,2),1))
scala> val s = Set("x", "y")
s: scala.collection.Set[String] = Set(x, y)
scala> transform(s)
res4: scala.collection.Set[(String, Int)] = Set((x,0), (y,1))
scala> val seq = List("x", "y")
seq: List[String] = List(x, y)
scala> transform(seq)
res5: List[(String, Int)] = List((x,0), (y,1))
关键是使用Like
trait,因为它带有正在使用的集合的类型。然后,隐式转换负责其余的工作。注意,如何Map
处理。似乎隐式转换默认为转换Iterable
为List
,这是有道理的。