Por que a opção não estende a característica iterável diretamente?
-
25-09-2019 - |
Pergunta
Option
é implicitamente conversível para um Iterable
- mas por que isso não apenas implementa Iterable
diretamente:
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: Na verdade, é até weider do que isso porque em 2.8 Option
Declara um iterator
método:
def iterator: Iterator[A] =
if (isEmpty) Iterator.empty else Iterator.single(this.get)
Solução
Estou pensando que havia muitos métodos não sensuais que seriam necessários. Por exemplo, para que você esperaria que o valor de retorno seja:
Some(1) ++ Some(2)
Atualmente, isso compila e avalia a lista (1,2) via Implicits em 2.8, mas parece estranho.
Talvez seja por isso que o Doc comenta no 2.7 Diga:
Only potentially unbounded collections should directly sub-class Iterable
Editar: Conforme mostrado no comentário de @mattr abaixo, deixando de fora a recomendação do comércio de documentos para a coleção do subtipo é potencialmente enganador. E considerando que ele se transforma em "Por que a opção não estende o traço de coleta?"