为什么Iterator在Scala 2.8中有一个contains方法但是Iterable没有?

时间:2010-05-27 23:37:51

标签: scala iterator scala-2.8 scala-collections

我想在我的Iterables上调用'contains': - )

2 个答案:

答案 0 :(得分:23)

Iterable没有contains方法的原因是因为它的定义方式会对方差产生直接影响。基本上,有两种类型的签名对它有意义:

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

第二个定义增加了类型安全性。但是,作为集合的类型参数的A出现在反变量位置,这会强制集合不变。 可以定义如下:

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

但是使用Any时,这不会对第一个签名提供任何改进。

因此,您会看到immutable.Seq是共变体并使用第一个签名,而immutable.Set是不变的并使用第二个签名。

答案 1 :(得分:5)

我不知道为什么containsIterable未定义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))