Scala-Bereich enthält(Element:Beliebige) Methode
Frage
Offenbar Range
hat eine Methode, die prüft, ob sie einen Wert vom Typ Any enthält.Ich verstehe, dass es von ist SeqLike
, verursacht aber einige Probleme.
Zum Beispiel habe ich Stunden von Joda abgeglichen.Datum /Uhrzeit:
DateTime.now match {
case d if 0 to 12 contains d.hourOfDay() => ...
Hier gibt d.hourOfDay () Datum / Uhrzeit zurück.Eigenschaft, nicht Int, aber Code wird immer noch kompiliert, weil contains(elem: Any)
.Gibt es eine Möglichkeit, zur Kompilierungszeit nach solchen Aufrufen zu suchen?
Lösung
Sie können Zuhälter Range
so fügen Sie eine typsichere contains-Methode hinzu:
class SafeRange( range: Range ) {
def safeContains( i: Int ) = range contains i
}
object SafeRange {
implicit def safer( range: Range ) = new SafeRange( range )
}
Implizit importieren und aufrufen safeContains
auf jeder Bereichsinstanz:
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
Andere Tipps
Sie können die typsicheren equals von Scalaz verwenden (===
) in Verbindung mit exists
methode auf 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" }
^
Basierend auf die scaladocs für Reichweite es sieht so aus, als ob es keine bessere Entfernungsmethode gibt, die Sie verwenden könnten.Ihre Optionen scheinen zu sein
Verwenden Sie eine explizite Typsignatur:
case d if 0 to 12 contains (d.hourOfDay(): Int) => ...
Machen Sie Ihre eigene Methode:
def containsInt(r: Range, i: Int) = ...
Dies scheint ein Überbleibsel von Java zu sein equals
Prägenerika zu sein, und ist nur eine der Unannehmlichkeiten, die diese Tatsache für Scala verursacht.