16

Iterables で「contains」を呼び出したい :-)

4

2 に答える 2

27

Iterableメソッドがない理由は、containsメソッドの定義方法が分散に直接影響を与える可能性があるためです。基本的に、意味のある 2 つの型シグネチャがあります。

def contains(v: Any): Boolean
def contains(v: A): Boolean

2 番目の定義では、型の安全性が向上しています。ただし、Aコレクションの型パラメーターである は反変の位置に表示されるため、コレクションは強制的に不変になります。次のように定義できます。

def contains[B >: A](v: B): Boolean

しかし、それは最初の署名を改善するものではありませんAny.

immutable.Seqこの結果、は共変で最初の署名を使用し、immutable.Setは不変で 2 番目の署名を使用することがわかります。

于 2010-07-13T01:58:00.800 に答える
5

がまたはでcontains定義されていない理由はわかりませんが、自分で簡単に定義できます。IterableTraversableOnce

class TraversableWithContains[A](underlying: TraversableOnce[A]) {
  def contains(v: Any): Boolean =
    underlying.exists(_ == v)
}
implicit def addContains[A](i: Iterable[A]) = new TraversableWithContains(i)

Iterable で定義されているかのように使用します。

val iterable: Iterable[Int] = 1 to 4
assert(iterable.contains(3))
assert(!iterable.contains(5))
于 2010-07-12T16:24:29.067 に答える