Scala Rango contiene(elem:Cualquier método de
Pregunta
Al parecer Range
tiene un método que comprueba si contiene un valor de tipo Alguno.Entiendo que es de SeqLike
, pero hace algunos problemas.
Por ejemplo, yo era la coincidencia de horas de joda.DateTime:
DateTime.now match {
case d if 0 to 12 contains d.hourOfDay() => ...
Aquí d.hourOfDay() devuelve DateTime.La propiedad, no de tipo Int, pero el código se compila, porque de contains(elem: Any)
.Hay alguna forma de comprobar este tipo de llamadas en tiempo de compilación?
Solución
Usted puede chulo Range
para agregar un tipo de seguro contiene el método:
class SafeRange( range: Range ) {
def safeContains( i: Int ) = range contains i
}
object SafeRange {
implicit def safer( range: Range ) = new SafeRange( range )
}
Importar lo implícito y lo llame safeContains
en cualquier rango de ejemplo:
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
Otros consejos
Puede usar la tipografía de Scalaz es igual (===
) junto con el método exists
en 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" }
^
Basado en el scaladocs para el Rango parece que no hay una mejor Gama método que se puede utilizar.Sus opciones parecen ser
El uso de un tipo explícito de la firma:
case d if 0 to 12 contains (d.hourOfDay(): Int) => ...
Hacer su propio método:
def containsInt(r: Range, i: Int) = ...
Este parece ser un vestigio de Java equals
siendo pre-genéricos, y es sólo uno de los inconvenientes que este hecho hace que para la Scala.