2010-04-09 12 views
16

Option è implicitamente convertibile in una Iterable - ma perché non è solo solo attuare Iterable direttamente:Perché l'opzione non estende direttamente il tratto Iterable?

def iterator = new Iterator[A] { 
    var end = !isDefined 
    def next() = { 
    val n = if (end) throw new NoSuchElementException() else get 
    end = true 
    n 
    } 

    def hasNext = !end 
} 

EDIT:In realtà è ancora Weider di quello, perché in 2.8 Option fa dichiarare un metodo di iterator :

def iterator: Iterator[A] = 
    if (isEmpty) Iterator.empty else Iterator.single(this.get) 
+1

È sempre possibile modificare il codice sorgente e vedere quali interruzioni. :-) –

+0

Bene, 'isEmpty' avrebbe bisogno di un modificatore' override' per i principianti! Mi chiedevo solo se fosse una cosa concettuale –

+0

Immagino che sia perché Option è una monade e non una collezione. Per me ha senso che le raccolte siano iterabili, ma una monade non è una collezione immediatamente. Btw: Non so su Scala 2.7, ma nel 2.8 Option.iterator è implementato usando Iterator.empty e Iterator.single. –

risposta

9

sto pensando che ci fossero troppi metodi non senza senso che sarebbero richiesti. Per esempio, che cosa si aspetta il valore di ritorno per essere per:

Some(1) ++ Some(2) 

Questo compila attualmente e valuta to List (1,2) tramite impliciti in 2.8, ma sembra strano.

Forse è per questo che i commenti di documentazione a 2,7 dicono:

Only potentially unbounded collections should directly sub-class Iterable 

Edit: Come mostrato nella @ di mattr commento qui sotto, lasciandomi il doc-commento raccomandazione di sottotipo Collection è potenzialmente fuorviante . E considerando che trasforma questa domanda in "Perché l'Opzione non estende il tratto della Collezione?"

+2

La documentazione dice: "Se una raccolta ha una dimensione nota, dovrebbe anche sottocartare Raccolta. Solo le raccolte potenzialmente illimitate dovrebbero essere direttamente sotto classe Iterable". –

+0

@Matt - se lo pubblichi come risposta, verrà accettato! –

+0

@oxbow: non sono sicuro che dovrebbe! La domanda è quindi solo leggermente diversa: perché Option non dovrebbe sottotettere Collection, che è una "Variante di Iterable usata per descrivere le collezioni con un numero finito di elementi"? –

Problemi correlati