2010-04-09 10 views
16

Option es convertir implícitamente a un Iterable - pero ¿por qué no sólo acaba de poner en práctica Iterable directamente:¿Por qué la opción no extiende el rasgo 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 
} 

EDIT:De hecho, es incluso Weider que eso, porque en el 2,8 Option sí declara un método iterator :

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

Siempre puede cambiar el código fuente y ver qué se rompe. :-) –

+0

¡Bueno, 'isEmpty' necesitaría un modificador' override' para principiantes! Solo me preguntaba si era algo conceptual –

+0

Supongo que es porque Option es una mónada y no una colección. Para mí tiene sentido que las colecciones sean iterables, pero una mónada no es una colección inmediata. Por cierto: no sé acerca de Scala 2.7, pero en 2.8 Option.iterator se implementa utilizando Iterator.empty e Iterator.single. –

Respuesta

9

Estoy pensando que hay demasiados métodos no absurdos que serían necesarios. Por ejemplo, ¿qué se espera que el valor de retorno sea para:

Some(1) ++ Some(2) 

Esto compila y evalúa actualmente a la lista (1,2) a través implícitos en 2.8, pero parece extraño.

Tal vez por eso los comentarios de documentación en 2,7 dicen:

Only potentially unbounded collections should directly sub-class Iterable 

Editar: Como se muestra en el comentario de @ MattR abajo, dejándome el doc-comentario recomendación de Colección subtipo puede inducir a error . Y teniendo en cuenta que se transforma esta pregunta en "¿Por qué la opción no extiende el rasgo de la colección?"

+2

La documentación dice: "Si una colección tiene un tamaño conocido, también debe subtitular la Colección. Solo las colecciones potencialmente ilimitadas deben ser directamente subclase Iterable". –

+0

@Matt: ¡si publica eso como respuesta, será aceptado! –

+0

@oxbow: ¡No estoy seguro de que así sea! La pregunta entonces es solo ligeramente diferente: ¿por qué la Opción no debe subtipificar la Colección, que es una "Variante de Iterable utilizada para describir colecciones con un número finito de elementos"? –

Cuestiones relacionadas