Question

Apparemment Range A une méthode qui vérifie s'il contient une valeur de type. Je comprends que c'est de SeqLike, mais cause quelques problèmes.

Par exemple, je correspondais à des heures de joda.datetime:

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

Ici d.Hourofday () Renvoie datetime.property, pas int, mais le code compile toujours, à cause de contains(elem: Any). Existe-t-il un moyen de vérifier ces appels au moment de la compilation?

Était-ce utile?

La solution

Tu peux souteneur Range Pour ajouter un type de type contient la méthode:

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

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

Importer l'implicite et l'appel safeContains Sur n'importe quelle instance de plage:

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

Autres conseils

Vous pouvez utiliser l'égal de type de type Scalaz (===) en conjonction avec exists méthode sur 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" }
                             ^

Basé sur les scaladocs pour la gamme Il semble qu'il n'y ait pas de méthode de meilleure gamme que vous pourriez utiliser. Vos options semblent être

Utilisez une signature de type explicite:

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

Faites votre propre méthode:

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

Cela semble être un holdover de Java equals Étant des pré-génériques, et n'est qu'un des inconvénients que ce fait provoque pour Scala.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top