16

Option est implicitement convertible en une Iterable - mais pourquoi il ne fait pas que simplement mettre en œuvre Iterable directement:Pourquoi l'option ne prolonge-t-elle pas directement le trait 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 
} 

EDIT:En fait, il est même Weider que parce que dans 2,8 Option ne déclare une méthode iterator :

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

Vous pouvez toujours changer le code source et voir quelles pauses. :-) –

+0

Eh bien, 'isEmpty' aurait besoin d'un modificateur' override' pour les débutants! Je me demandais juste si c'était une chose conceptuelle –

+0

Je suppose que c'est parce que l'option est une monade et non une collection. Pour moi, il est logique que les collections soient itératives, mais une monade n'est pas une collection tout de suite. Btw: Je ne connais pas Scala 2.7, mais dans 2.8 Option.iterator est implémenté en utilisant Iterator.empty et Iterator.single. –

Répondre

9

Je pense qu'il y avait trop de méthodes non-absurdes qui seraient nécessaires. Par exemple, qu'est-ce que vous vous attendez à la valeur de retour soit pour:

Some(1) ++ Some(2) 

Cette compile actuellement et évalue à la liste (1,2) par l'intermédiaire implicits à 2,8, mais il semble étrange.

Peut-être est la raison pour laquelle les commentaires de doc à 2.7 disent:

Only potentially unbounded collections should directly sub-class Iterable 

Edit: Comme le montre @ MichelR de commentaire ci-dessous, me laissant la recommandation doc-commentaire à la collection sous-type est potentiellement trompeur . Et considérant qu'il transforme cette question en "Pourquoi l'option ne prolonge-t-elle pas le trait de collection?"

+2

La documentation dit: «Si une collection a une taille connue, elle devrait également sous-type Collection.Seules collections potentiellement non bornées devraient directement sous-classer Iterable». –

+0

@Matt - Si vous postez cela comme une réponse, il sera accepté! –

+0

@oxbow: Je ne suis pas sûr que ça devrait! La question n'est alors que légèrement différente: pourquoi l'option ne devrait-elle pas sous-typer Collection, qui est une "variante d'Iterable utilisée pour décrire des collections avec un nombre fini d'éléments"? –

Questions connexes