La gamme Scala contient (elem: any) méthode
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?
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.