La gamma Scala contiene (elem: qualsiasi) metodo
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?
Soluzione
Puoi 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.