Domanda

Apparentemente Range ha un metodo che controlla se contiene un valore di tipo Any.Capisco che provenga da SeqLike, ma causa alcuni problemi.

Ad esempio, stavo abbinando le ore da joda.DateTime:

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

Qui d.hourOfDay () restituisce DateTime.Property, non Int, ma il codice viene comunque compilato, a causa di contains(elem: Any).Esiste un modo per verificare la presenza di tali chiamate in fase di compilazione?

È stato utile?

Soluzione

Puoi Pimp Range per aggiungere un metodo di contiene un tipo:

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

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

Importa il safeContains implicito e chiamate su qualsiasi istanza dell'intervallo:

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
.

Altri suggerimenti

Puoi utilizzare il typesafe equals di Scalaz (===) insieme al metodo exists su 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" }
                             ^

Basato su I Scaducs for Gamma Sembra che non ci sia un metodo della gamma migliore che potresti usare.Le tue opzioni sembrano essere

Utilizzare una firma di tipo esplicita:

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

crea il tuo metodo:

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

Questo sembra essere una presa da Java equals essendo pre-generico, ed è solo uno degli inconvenienti questo fatto causa per Scala.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top