Scala Rangeには(Elem:Any)メソッドが含まれています
質問
どうやら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(===
)を、exists
のTraversableOnce
メソッドと組み合わせて使用できます。
ジェネラコディセタグプレ
範囲のScaladocs 使用できるより良い範囲の方法がないようです。あなたの選択肢はのようです
明示的なタイプの署名を使用:
case d if 0 to 12 contains (d.hourOfDay(): Int) => ...
.
あなた自身の方法を作る:
def containsInt(r: Range, i: Int) = ...
.
これは、Java equals
からのホールドオーバーのようです、そして、この事実がスカラの原因である不都合のうちの1つにすぎません。
所属していません StackOverflow