scala - name - ¿Por qué la opción no extiende el rasgo iterable directamente?
scala by name parameter (1)
Option
se puede convertir implícitamente a un Iterable
, pero ¿por qué no se limita a implementar Iterable
directamente?
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
}
EDITAR: De hecho, es incluso más extraño que eso porque en 2.8 Option
declara un método iterator
:
def iterator: Iterator[A] =
if (isEmpty) Iterator.empty else Iterator.single(this.get)
Estoy pensando que había demasiados métodos sin sentido que serían necesarios. Por ejemplo, ¿cuál esperaría que fuera el valor de retorno para:
Some(1) ++ Some(2)
Actualmente, se compila y evalúa a la Lista (1,2) a través de los implícitos en 2.8, pero parece extraño.
Tal vez es por eso que el doc comenta en 2.7 decir:
Only potentially unbounded collections should directly sub-class Iterable
Edición: como se muestra en el comentario de @ MattR a continuación, dejar de lado la recomendación doc-comment para sub-tipo Collection es potencialmente engañoso. Y considerando que se transforma esta pregunta en "¿Por qué Option no extiende el rasgo de la Colección?"