Iterables で「contains」を呼び出したい :-)
3952 次
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
定義されていない理由はわかりませんが、自分で簡単に定義できます。Iterable
TraversableOnce
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 に答える