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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top