2010-09-14 14 views
7

perché i metodi transform (sul posto versione mutazione del map) e retain (sul posto versione mutazione del filter) sono definiti solo su mutable.Map ma non su mutable.Buffer e mutable.Set? shouldnt tutte le collezioni mutabili supportano questi metodi?inconsistenza di scala 2.8 collezioni?

+1

più una cosa. 'immutable.MapLike' ha il metodo' transform', ma non il metodo 'retain'. –

+0

@michael: Ho aggiornato la mia risposta per tenere conto di questa differenza. – VonC

risposta

8

Le operazioni retain e transform di Map sono sulle chiavi e valori, concetti che non fanno parte di un Set o un Buffer.

Una mappa è un Iterable costituito da coppie di chiavi e valori (denominati anche associazioni o associazioni).
Le operazioni fondamentali sulle mappe sono simili a quelle sui set.

Ma le operazioni sono elencati in:

mappe Mutevole sostenere oltre le operazioni riassunte nella tabella seguente.

ms transform f 

Converte tutti i valori associati nella cartina ms con funzione f.

ms retain p 

Mantiene solo quelle mappature in ms che hanno un key soddisfacente predicato p.


one-zero-zero-one commenti:

retain e transform sono essenzialmente in-place versioni mutazione di filter e map rispettivamente, e possono essere facilmente definiti in Set e Buffer.
Non vedo come sono Map -specific.

Direi che retain e transform offerta conforme alla Mappa implementazioni (in quanto la loro applicazione si occupa specificamente di chiavi e valori) per le caratteristiche come quelli forniti da map e filter da TraversableLike.

L'implementazione di transform in Set e Buffer aggiungerebbe poco valore dato che sarebbe semplicemente differito a map.


Nota: Michael Kebe commenti:

più una cosa. immutable.MapLike ha il metodo transform, ma non il metodo retain.

(al contrario di mutable.MapLike che ha sia)

Questo sembra tuttavia in linea con la natura delle transformation operations se trasformare produce una nuova mappa filtrando e trasformando legature di una mappa esistente.

Ecco la source code for transform

def transform[C, That](f: (A, B) => C)(implicit bf: CanBuildFrom[This, (A, C), That]): That = { 
    val b = bf(repr) 
    for ((key, value) <- this) b += ((key, f(key, value))) 
    b.result 
} 

Source code for retain, tuttavia, ha modificato l'istanza corrente, che può essere compatibile solo con oggetti mutabili:

/** Retains only those mappings for which the predicate 
* `p` returns `true`. 
* 
* @param p The test predicate 
*/ 
def retain(p: (A, B) => Boolean): this.type = { 
    for ((k, v) <- this ; if !p(k, v)) 
    this -= k 

    this 
} 
+0

-1, 'retain' e' transform' sono essenzialmente versioni di mutazione sul posto di 'filter' e' map' rispettivamente e possono essere facilmente definiti su 'Set' e' Buffer'. Non vedo come siano specifici di 'Map'. –

+0

@one: il modo in cui sono documentati implica nozioni specifiche della mappa. Ma hai ragione, potrebbero essere estesi a Set e Buffer. Tuttavia, poiché 'filter' e' map' sono già presenti, potrebbe essere necessario meno per 'Set' e' Buffer'. – VonC

+0

@ one-zero-zero-one: ho aggiornato la mia risposta per riflettere sul tuo commento. – VonC

Problemi correlati