一个范围可以在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)