4

AnyRange型の値が含まれているかどうかを確認するメソッドがあるようです。からのものであることは理解していますがSeqLike、いくつかの問題が発生します。

たとえば、私は joda.DateTime から時間を一致させていました:

DateTime.now match {
    case d if 0 to 12 contains d.hourOfDay() => ...

ここで d.hourOfDay() は Int ではなく DateTime.Property を返しますが、contains(elem: Any). コンパイル時にそのような呼び出しをチェックする方法はありますか?

4

3 に答える 3

7

Scalazのtypesafeequals(===)をのexistsメソッドと組み合わせて使用​​できますTraversableOnce

scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> 1 to 5 exists { _ === 2 }
res1: Boolean = true

scala> 1 to 5 exists { _ === "Hullo" }
<console>:14: error: type mismatch;
 found   : java.lang.String("Hullo")
 required: Int
       1 to 5 exists { _ === "Hullo" }
                             ^
于 2011-09-12T10:36:18.747 に答える
6

タイプセーフな contains メソッドを追加するためにポン引き できます。Range

class SafeRange( range: Range ) {
  def safeContains( i: Int ) = range contains i
}

object SafeRange {
  implicit def safer( range: Range ) = new SafeRange( range )
}

safeContains任意の範囲インスタンスで暗黙的および呼び出しをインポートします。

scala> import SafeRange._
import SafeRange._

scala> (0 until 10) safeContains 3
res2: Boolean = true

scala> (0 until 10) safeContains 100
res3: Boolean = false

scala> (0 until 10) safeContains "foo"
<console>:18: error: type mismatch;
 found   : java.lang.String("foo")
 required: Int
          (0 until 10) safeContains
于 2011-09-12T07:58:26.060 に答える
3

Range の scaladocs に基づいて、使用できるより良い Range メソッドはないようです。あなたのオプションは

明示的な型シグネチャを使用します。

 case d if 0 to 12 contains (d.hourOfDay(): Int) => ...

独自の方法を作成します。

 def containsInt(r: Range, i: Int) = ...

これは Javaequalsがプレジェネリックであることの名残りのようであり、この事実が Scala にもたらす不都合の 1 つにすぎません。

于 2011-09-12T07:53:27.917 に答える