16

Option jest niejawnie zamienny do Iterable - ale dlaczego nie po prostu tylko wdrożyć Iterable bezpośrednio:Dlaczego opcja nie rozszerza bezpośrednio cechy Iterowalnej?

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:W rzeczywistości jest to nawet Weider niż ponieważ w 2,8 Option ma zadeklarować metodę iterator :

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

Zawsze możesz zmienić kod źródłowy i zobaczyć, co łamie. :-) –

+0

Cóż, 'isEmpty' będzie potrzebował modyfikatora' override' na początek! Właśnie zastanawiałem się, czy to była pojęciowa rzecz. –

+0

Myślę, że to dlatego, że Option to monada, a nie zbiór. Dla mnie ma sens, że kolekcje są iterable, ale monada nie jest zbiorem od razu. Btw: Nie wiem o Scali 2.7, ale w 2.8 Option.iterator jest implementowany za pomocą Iterator.empty i Iterator.single. –

Odpowiedz

9

Myślę, że było zbyt wiele niesensownych metod, które byłyby wymagane. Na przykład, co można oczekiwać wartość zwracana będzie na:

Some(1) ++ Some(2) 

to obecnie zbiera i ocenia się do listy (1,2) poprzez implicits w 2.8, ale wydaje się dziwne.

Może dlatego komentarze DOC 2,7 powiedzieć:

Only potentially unbounded collections should directly sub-class Iterable 

Edit: Jak pokazano na użytkownika @ MattR komentarzu poniżej, mnie pomijając zalecenia doc-komentarz sub typu kolekcji jest potencjalnie mylące . Biorąc to pod uwagę, zmienia się to pytanie w "Dlaczego opcja nie rozszerza cechy kolekcji?"

+2

Dokumentacja mówi: "Jeśli kolekcja ma znany rozmiar, powinna również zawierać podtyp kolekcji. Tylko potencjalnie nieograniczone kolekcje powinny być bezpośrednio podklasą Iterable". –

+0

@Matt - jeśli napiszesz to jako odpowiedź, zostanie ona zaakceptowana! –

+0

@oxbow: Nie jestem pewien, czy powinno! Pytanie jest wtedy tylko trochę inne: dlaczego opcja nie ma podtypu Kolekcja, która jest "wariantem Iterable używanym do opisywania zbiorów o skończonej liczbie elementów"? –

Powiązane problemy