51

Scalaで値の範囲を一致させることは可能ですか?

例えば:

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

mが0 ~ 10 のtrue場合は になりますが、それ以外の場合は false です。tもちろん、これは少しうまくいきませんが、そのようなことを達成する方法はありますか?

4

5 に答える 5

79

使用するガードRange:

val m = t match {
  case x if 0 until 10 contains x => true
  case _ => false
}
于 2009-08-28T10:48:17.893 に答える
34

ガードを使用できます:

val m = t match {
    case x if (0 <= x && x < 10) => true
    case _ => false
}
于 2009-08-28T10:43:21.943 に答える
4

これらの定義では:

  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)
于 2014-09-26T12:47:52.477 に答える
3

範囲を使用して一致させる別の方法を次に示します。

val m = t match {
  case x if ((0 to 10).contains(x)) => true
  case _ => false
}
于 2012-07-02T04:28:36.210 に答える