Perché opzione si estende direttamente il tratto Iterable?
-
25-09-2019 - |
Domanda
Option
è implicitamente convertibile in una Iterable
- ma perché non è solo solo implementare direttamente 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
}
Modifica In realtà è ancora Weider di quello, perché in 2.8 Option
non dichiarare un metodo di iterator
:
def iterator: Iterator[A] =
if (isEmpty) Iterator.empty else Iterator.single(this.get)
Soluzione
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 in:
Some(1) ++ Some(2)
Questa compila attualmente e restituisce List (1,2) tramite impliciti in 2.8, ma sembra strano.
Forse è per questo che i commenti di documentazione a 2,7 diciamo:
Only potentially unbounded collections should directly sub-class Iterable
Modifica Come mostrato nella @ commento di mattr seguito, lasciandomi il doc-commento raccomandazione di sottotipo Collection è potenzialmente fuorviante. E considerando che trasforma questa domanda in "Perché Opzione non estendere la raccolta tratto?"