Scala相当于Python的"in"运算符集合?

bns*_*ith 4 scala scala-collections

在Scala中,可以使用"Contains"检查项目是否是Set的成员:

object Main extends App {
    val the_set = Set(1, 2, 3, 4)
    if( the_set contains 3 ) println("The set contains 3!")
}
Run Code Online (Sandbox Code Playgroud)

但是,我想做一个类似的比较,但是首先是项目,最后是设置(我知道一个小的风格点).我有一些Python的背景,所以我希望运算符的Python 有一些东西:

the_set = set([1, 2, 3, 4])
if 3 in the_set: print "The set contains 3!"
Run Code Online (Sandbox Code Playgroud)

在Scala有什么办法吗?如果你很好奇,我想要这样做的原因是编写一个简洁的if语句,将一个值与我构建的long Set进行比较.同时,我希望项目首先出现,以便代码更易于阅读和理解.

谢谢!

Eug*_*Loy 11

以下是如何执行此操作的一个示例:

scala> implicit class InOperation[T](v: T) extends AnyVal { def in(s: Set[T]) = { s contains v } }
defined class InOperation

scala> val x = Set(1,2,3)
x: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> 2 in x
res0: Boolean = true
Run Code Online (Sandbox Code Playgroud)

它使用隐式类in方法(接受Set[T])添加到任意类型T并检查对象是否在集合中.

  • @bnsmith两个`2 in x`和`x contains 2`都是可读的,所以这是个人风格.Scala与后者一起使用,因为它更适合其他功能.恕我直言,当它与其他函数结合时变得更具可读性,例如:`if(List(1,2,3)map(_*2)filter(_> 2)包含4) (4认同)
  • 使用[Value Classes](http://docs.scala-lang.org/overviews/core/value-classes.html#extension-methods)删除运行时开销. (3认同)