16

Option ist implizit konvertierbar zu einem Iterable - aber warum nur Iterable es nicht nur direkt implementieren:Warum erweitert Option das Iterable-Merkmal nicht direkt?

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 der Tat ist es sogar weider ist als das, weil in 2,8 Option nicht erklärt eine iterator Methode :

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

Sie könnten immer den Quellcode ändern und sehen, was bricht. :-) –

+0

Nun, 'isEmpty' würde einen 'override' Modifikator für Anfänger benötigen! Ich fragte mich nur, ob es eine konzeptionelle Sache war –

+0

Ich denke, das ist, weil Option eine Monade und keine Sammlung ist. Für mich macht es Sinn, dass Sammlungen iterierbar sind, aber eine Monade ist nicht sofort eine Sammlung. Btw: Ich weiß nichts über Scala 2.7, aber in 2.8 wird Option.iterator mit Iterator.empty und Iterator.single implementiert. –

Antwort

9

Ich denke, dass es zu viele nicht unsinnige Methoden gab, die erforderlich wären. Zum Beispiel, was man erwarten würde der Wert Rückkehr zu sein für:

Some(1) ++ Some(2) 

Dies kompiliert zur Zeit und bewertet (1,2) über implicits in 2.8 zur Liste, aber es scheint seltsam.

Vielleicht ist das, warum die doc Kommentare in 2.7 sagen:

Only potentially unbounded collections should directly sub-class Iterable 

Edit: Wie in @ MattR Kommentar unten, mir die doc-Kommentar Empfehlung an Sub-Typ-Sammlung ist irreführend Weglassen potentiell . Und wenn man es in Betracht zieht, verwandelt sich diese Frage in "Warum erweitert Option das Sammlungsmerkmal nicht?"

+2

Die Dokumentation besagt: "Wenn eine Sammlung eine bekannte Größe hat, sollte sie auch die Sammlung unterteilen. Nur potenziell ungebundene Sammlungen sollten die Unterklasse Iterable direkt untergliedern." –

+0

@Matt - wenn Sie das als Antwort posten, wird es akzeptiert! –

+0

@oxbow: Ich bin mir nicht sicher, dass es sollte! Die Frage ist dann nur etwas anders: Warum sollte Option nicht Subtype Collection sein, was ist eine "Variante von Iterable, die verwendet wird, um Sammlungen mit einer endlichen Anzahl von Elementen zu beschreiben"? –

Verwandte Themen