2011-11-06 1 views
8

Je lis "Programmation en Scala 2ed". Dans la section 24.4, il est noté que Iterable contient de nombreuses méthodes qui ne peuvent être écrites efficacement sans un itérateur. Le tableau 24.2 contient ces méthodes. Cependant, je ne comprends pas pourquoi certains d'entre eux ne peuvent pas être implémentés efficacement sur itérateur. Par exemple, considérons zipWithIndex. Pourquoi ne pas déplacer cette définition vers traversable? Il me semble que le code pourrait être exactement le même et qu'il n'y aurait pas de différence d'efficacité.Pourquoi zipWithIndex est-il implémenté dans Iterable et non Traversable?

+0

Je voulais juste ajouter un cas d'utilisation pour '' zipWithIndex' sur Traversable '. Que faire si vous implémentez une méthode pour choisir un élément aléatoire à partir d'un traversable? Lorsque vous itérez sur les éléments, vous avez besoin d'un index pour aider les probabilités, même si l'index ne correspond pas à un emplacement persistant avec la structure. – schmmd

Répondre

11

Vous avez tout à fait raison, et votre implémentation devrait fonctionner. Aucune bonne raison d'avoir zipWithIndex défini dans Iterable et non Traversable; ne donne aucune garantie quant à la commande des éléments en cours de traversée.

(Ceci est ma première réponse sur StackOverflow. L'espoir que je suis utile. :) Si je ne l'ai pas, s'il vous plaît me dire.)

+0

Totalement utile, vous avez +6 pour ça! Je me suis juste assuré que je ne manquais pas quelque chose car le chapitre indique clairement que les méthodes de la table sont implémentées dans Iterable parce qu'elles sont plus faciles ou plus efficaces. – schmmd

10

Traversable ne garantit pas l'ordre dans lequel les éléments seront visités et ne vous oblige à définir une méthode foreach avec la signature suivante:

def foreach[U](f: Elem => U): Unit 

Depuis cette méthode a juste besoin d'appeler f pour chaque élément dans n'importe quel ordre, cela n'a pas de sens d'avoir un index sur les éléments puisque l'ordre pourrait être différent pour chaque invocation de foreach.

Éditer: Ceci est vraiment juste une explication, pourquoi ce n'est pas sur Traversable. Comme Luigi l'a souligné dans les commentaires, zipWithIndex aurait plus de sens sur Seq.

+1

Je suis d'accord que les indices ne sont pas intrinsèquement significatifs sur un «Traversable» (considérons par exemple les graphiques). En particulier, vous ne pourrez rien faire avec l'index * obtenu sur la collection *. Mais vous voudrez peut-être avoir l'index "loop" pour quelque chose d'autre (et juste pour imiter avoir "i" dans une boucle 'for' typique de Java), alors pourquoi pas? – Raphael

+1

'Iterable' (qui inclut des cartes et des ensembles) ne garantit pas l'ordre dans lequel les éléments seront également visités. Une meilleure question demanderait pourquoi 'zipWithIndex' est défini sur' Iterable' plutôt que 'Seq'. –

+0

Après cette discussion, il semble que foreach a plus de sens sur Traversable (pourquoi pas) ou Seq (ordre garanti)! – schmmd

Questions connexes