ada*_*m77 15 iterator scala scala-2.8 scala-collections
我想在我的Iterables上打电话'包含':-)
Dan*_*ral 24
Iterable没有contains方法的原因是因为它的定义方式会对方差产生直接影响.基本上,有两种类型的签名对它有意义:
def contains(v: Any): Boolean
def contains(v: A): Boolean
Run Code Online (Sandbox Code Playgroud)
第二个定义增加了类型安全性.但是,A它是集合的类型参数,出现在反变量位置,这会强制集合不变.它可以这样定义:
def contains[B >: A](v: B): Boolean
Run Code Online (Sandbox Code Playgroud)
但使用时,这不会对第一个签名提供任何改进Any.
因此,您将看到它immutable.Seq是共变体并使用第一个签名,而immutable.Set不变并使用第二个签名.
我不知道为什么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)
Run Code Online (Sandbox Code Playgroud)
并使用它就好像它是在Iterable上定义的:
val iterable: Iterable[Int] = 1 to 4
assert(iterable.contains(3))
assert(!iterable.contains(5))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3052 次 |
| 最近记录: |