2012-04-16 9 views
5

Il metodo facoltativo è un metodo che può essere applicato se i generici di classe hanno un tipo specifico. esempi:Qual è il modo migliore per definire i metodi facoltativi sicuri in Scala?

list.unzip //works only if this is collection of pairs 
list.sum //works only if this collection of numbers 

Attualmente mi vogliono implementare il metodo di regressione che ha le stesse limitazioni come decomprimere (vale a dire la raccolta di punti 2D), ma non so come fare in modo che il metodo (implicit asPair: A => (A1, A2) exsist e dove il posto migliore per definire tali conversioni.

+4

si potrebbe trovare [tipo generalizzato vincoli] (http: // StackOverflow .com/questions/3427345/what-do-and-mean-in-scala-2-8-and-where-are-they-documented) utili. –

risposta

10

Ecco cosa TraversableOnce.toMap fa per assicurarsi che sia chiamato solo su un insieme di coppie.

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = { 
    val b = immutable.Map.newBuilder[T, U] 
    for (x <- self) 
    b += x 
    b.result 
} 

Ma se si sta cercando di aggiungere un metodo simile a una classe di raccolta esistente, è possibile rendere ancora più facile:

class EnhancedIterable[T,U](x: Iterable[(T,U)]) { // CanBuildFrom omitted for brevity 
    def swapAll() = x.map(_.swap) 
} 
implicit def enhanceIterable[T,U](x: Iterable[(T,U)]) = new EnhancedIterable(x) 

List((1,2), (3,4), (5,6)).swapAll // List((2,1), (4,3), (6,5)) 
List(1, 2, 3).swapAll // error: value swapAll is not a member of List[Int]