一个范围可以在Scala中匹配吗?

是否有可能在Scala中匹配一系列值?

例如:

val t = 5 val m = t match { 0 until 10 => true _ => false } 

如果t在0和10之间, m将是true ,否则为假。 这一点当然不起作用,但有什么办法可以达到这样的效果吗?

使用Range守卫:

 val m = t match { case x if 0 until 10 contains x => true case _ => false } 

你可以使用警卫:

 val m = t match { case x if (0 <= x && x < 10) => true case _ => false } 

这是另一种使用范围匹配的方法:

 val m = t match { case x if ((0 to 10).contains(x)) => true case _ => false } 

有了这些定义:

  trait Inspector[-C, -T] { def contains(collection: C, value: T): Boolean } implicit def seqInspector[T, C <: SeqLike[Any, _]] = new Inspector[C, T]{ override def contains(collection: C, value: T): Boolean = collection.contains(value) } implicit def setInspector[T, C <: Set[T]] = new Inspector[C, T] { override def contains(collection: C, value: T): Boolean = collection.contains(value) } implicit class MemberOps[T](t: T) { def in[C](coll: C)(implicit inspector: Inspector[C, T]) = inspector.contains(coll, t) } 

你可以做这样的检查:

 2 in List(1, 2, 4) // true 2 in List("foo", 2) // true 2 in Set("foo", 2) // true 2 in Set(1, 3) // false 2 in Set("foo", "foo") // does not compile 2 in List("foo", "foo") // false (contains on a list is not the same as contains on a set) 2 in (0 to 10) // true 

所以你需要的代码是:

 val m = x in (0 to 10)