Advertencia: a partir de Scala 2.9.0, al menos, lo que deja el iterador originales vacía. Puede obtenerval ls = it.toList; val it1 = ls.iterator; val it2 = ls.iterator
para obtener dos copias. O use duplicate (que también funciona para los que no son de listas).
La respuesta de Rex es por libro, pero de hecho su solución original es de lejos la más eficiente para scala.collection.immutable.List.
Los iteradores de lista se pueden duplicar utilizando ese mecanismo esencialmente sin sobrecarga. Esto se puede confirmar mediante una revisión rápida de la implementación de iterator() en scala.collection.immutable.LinearSeq, esp. la definición del método toList, que simplemente devuelve _.toList del Seq de respaldo que, si es una Lista (como lo es en su caso) es la identidad.
No conocía esta propiedad de los iteradores de listas antes de investigar su pregunta, y estoy muy agradecido por la información ... entre otras cosas, significa que muchos algoritmos de "lista de guijarros" se pueden implementar de manera eficiente sobre Scala Listas inmutables usando Iterators como guijarros.
¿Por qué? Una vez que lo hayas clonado, el iterador original se consumirá e inútil, derrotando por completo el punto de un clon en primer lugar ... –
@Kevin, eso no es necesariamente así, ¿no? En abstracto, parece posible tener una operación que me proporcione un iterador que devolverá la misma secuencia que el iterador de origen; por supuesto, problemas de estado pueden hacer que sea imposible para todos los iteradores. No parece requerir inherentemente consumir el de origen. –
Cambiar de 'val' a' def' le daría un nuevo iterador cada vez que haga referencia al símbolo (llamado 'it' en el ejemplo anterior). En muchos casos, esta forma puede parecer más simple. – matanster