質問

どうやらRangeには、Any型の値が含まれているかどうかをチェックするメソッドがあります。これはSeqLikeによるものだと理解していますが、いくつかの問題が発生します。

たとえば、joda.DateTimeからの時間を一致させていました: ジェネラコディセタグプレ

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

役に立ちましたか?

解決

あなたは pimp Rangeタイプより安全なメソッドを追加する:

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

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

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

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
.

他のヒント

Scalazのtypesafe equals(===)を、existsTraversableOnceメソッドと組み合わせて使用できます。 ジェネラコディセタグプレ

範囲のScaladocs 使用できるより良い範囲の方法がないようです。あなたの選択肢はのようです

明示的なタイプの署名を使用:

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

あなた自身の方法を作る:

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

これは、Java equalsからのホールドオーバーのようです、そして、この事実がスカラの原因である不都合のうちの1つにすぎません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top