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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top