5

オプションのメソッドは、クラスジェネリックが特定のタイプを持っている場合に適用できるメソッドです。例:

list.unzip //works only if this is collection of pairs
list.sum //works only if this collection of numbers

現在、unzipと同じ制約(つまり2Dポイントのコレクション)を持つ回帰メソッドを実装したいのですが、そのメソッドが存在することを確認する方法(implicit asPair: A => (A1, A2)と、そのような変換を定義するのに最適な場所がわかりません。

4

1 に答える 1

10

TraversableOnce.toMapペアのコレクションでのみ呼び出されるようにするために行うことは次のとおりです。

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = {
  val b = immutable.Map.newBuilder[T, U]
  for (x <- self)
    b += x
  b.result
}

ただし、同様のメソッドを既存のコレクション クラスに追加する場合は、さらに簡単にすることができます。

class EnhancedIterable[T,U](x: Iterable[(T,U)]) { // CanBuildFrom omitted for brevity
  def swapAll() = x.map(_.swap)
}
implicit def enhanceIterable[T,U](x: Iterable[(T,U)]) = new EnhancedIterable(x)

List((1,2), (3,4), (5,6)).swapAll // List((2,1), (4,3), (6,5))
List(1, 2, 3).swapAll // error: value swapAll is not a member of List[Int]
于 2012-04-16T19:19:38.237 に答える