2010-05-10 11 views
6

I just a découvert qu'il existe de tels itérateurs en Java.
Est-ce que Scala a des itérateurs avec les méthodes 'set' et 'remove' pour itération (et modification) de collections mutables comme array?
S'il n'y a pas un tel itérateur alors y at-il une bonne raison à cela?Iterators pour des collections mutables à Scala?

+0

Vous devez copier (ou paraphraser) la réponse (s) que vous avez sur la liste de diffusion ici (pour la postérité). –

+0

@Rallall. Ok, j'ai donné le lien pour maximiser l'utilité. –

Répondre

6

Scala n'a actuellement pas d'itérateur.

Je soupçonne que ce ne est pas parce que

  • Ces itérateurs ne sont pas générales (i.e. ils ne sont utilisables avec des collections mutables) mais consomment espace de noms.

  • Parce qu'ils peuvent rapidement devenir source de confusion pour penser en conjonction avec les opérations paresseux comme takeWhile (Est-il toujours évident que x.takeWhile(_<5).add(5) devrait faire? D'une part, l'ordre des opérations semble que vous devriez prendre d'abord, puis ajouter mais de l'autre, take est paresseux en add peuvent souvent être mises en œuvre immédiatement, afin de les combiner cette façon serait naïvement dangereux)

  • Ces itérateurs ne sont une bonne idée algorithmiquement avec un ensemble très spécialisé des collections (essentiellement. seulement les listes et les arbres liés, ajouter et supprimer est stupide à utiliser sur les tableaux de toute façon, et cela n'a pas beaucoup de sens sur les ensembles). Lorsqu'un conflit intrinsèque survient entre la généralité et la rapidité, la bibliothèque de collections Scala privilégie généralement la généralité. Ce type d'itérateur vous fait penser aux collections d'une manière plus particulière (c'est-à-dire plus étroitement liée à la structure de données sous-jacente). Vous pouvez imaginer une bibliothèque qui a fait des choix différents, mais pour une bibliothèque au maximum utile (et encore assez performante), la philosophie de la bibliothèque de collections Scala est probablement la meilleure solution.

+0

Très bons arguments, merci. Je ne vois pas de danger avec takeWhile. C'est comme x = x + 1. Peut-être que certaines collections devraient fournir des itérateurs spécialisés mélangés de plusieurs traits? Ou mebye une sorte de référence devrait être retourné comme ici: http://stackoverflow.com/questions/2799128/how-to-get-ponter-reference-semantics-in-scala/2799208#2799208 –