¿Cuál es la razón del diseño para Vec
no implementar el Iterator
rasgo? Tener que recurrir siempre iter()
a todos los vectores y cortes hace que las líneas de código sean más largas.
Ejemplo:
let rx = xs.iter().zip(ys.iter());
en comparación con Scala:
val rx = xs.zip(ys)
Respuestas:
Un iterador tiene un estado de iteración. Debe saber cuál será el próximo elemento para darle.
Entonces, un vector en sí mismo no es un iterador, y la distinción es importante. Puede tener dos iteradores sobre el mismo vector, por ejemplo, cada uno con su estado de iteración específico.
Pero un vector puede proporcionarle un iterador, por eso se implementa
IntoIterator
, lo que le permite escribir esto:Muchas funciones toman un
IntoIterator
cuando se necesita un iterador, y ese es el casozip
, razón por la cualpuede ser reemplazado con
fuente
xs.zip(ys)
funciona en Scala entonces? ¿Se crea automáticamente un iterador (estado) en Scala? ¿O su "tipo de lista" siempre contiene un estado iterador? Cualquier solución que use Scala: ¿por qué Rust no la usa?iter()
,into_iter()
yiter_mut()
es importante.iter
) y requiera una llamada explícita a laiter_mut
iteración mutable.ys
enxs.iter().zip (ys)
: ¿cómo elige usarys.iter()
oys.iter_mut()
?ys
, usamosinto_iter
. La razón es simple:ys
se consume, por lo que otros tipos de iteradores no tienen sentido.¿Cuál de los tres iteradores debería implementar? Hay tres tipos diferentes de iterador que puede obtener de
Vec
:vec.iter()
daIterator<Item = &T>
,vec.iter_mut()
daIterator<Item = &mut T>
y modifica el vector yvec.into_iter()
daIterator<Item = T>
y consume el vector en el proceso.En Scala tampoco se implementa
Iterator
directamente, porqueIterator
necesita el siguiente puntero de elemento que el vector en sí no tiene. Sin embargo, dado que Scala no tiene semántica de movimiento, solo tiene una forma de crear un iterador a partir de un vector, por lo que puede hacer la conversión implícitamente. Rust tiene tres métodos, por lo que debe preguntarte cuál quieres.fuente
into_iter()
es el que consume el vector;drain
es diferente porque solo vacía el vector.