Qual é a razão do design para Vec
não implementar a Iterator
característica? Ter que sempre chamar iter()
todos os vetores e fatias cria linhas de código mais longas.
Exemplo:
let rx = xs.iter().zip(ys.iter());
em comparação com Scala:
val rx = xs.zip(ys)
Respostas:
Um iterador possui um estado de iteração. Ele deve saber qual será o próximo elemento a fornecer.
Portanto, um vetor por si só não é um iterador, e a distinção é importante. Você pode ter dois iteradores sobre o mesmo vetor, por exemplo, cada um com seu estado de iteração específico.
Mas um vetor pode fornecer um iterador, é por isso que ele implementa
IntoIterator
, o que permite escrever isso:Muitas funções ocorrem
IntoIterator
quando um iterador é necessário, e é o caso dissozip
, e é por isso quepode ser substituído por
fonte
xs.zip(ys)
funciona em Scala então? Um iterador (estado) é criado automaticamente no Scala? Ou seu "tipo de lista" sempre contém um estado de iterador? Qualquer que seja a solução que a Scala use: por que a Rust não a usa?iter()
,into_iter()
eiter_mut()
é importante.iter
) e exigir uma chamada explícitaiter_mut
para iteração mutável.ys
emxs.iter().zip (ys)
: como você escolhe usarys.iter()
ouys.iter_mut()
?ys
, nós usamosinto_iter
. O motivo é simples:ys
é consumido; portanto, outros tipos de iteradores não fazem sentido.Qual dos três iteradores ele deve implementar? Existem três tipos diferentes de iteradores que você pode obter em
Vec
:vec.iter()
dáIterator<Item = &T>
,vec.iter_mut()
dáIterator<Item = &mut T>
e modifica o vetor evec.into_iter()
forneceIterator<Item = T>
e consome o vetor no processo.No Scala, ele também não é implementado
Iterator
diretamente, porqueIterator
precisa do ponteiro do próximo item que o próprio vetor não possui. No entanto, como o Scala não possui semântica de movimentação, ele só tem uma maneira de criar um iterador a partir de um vetor, para que ele possa fazer a conversão implicitamente. O Rust possui três métodos, portanto, ele deve perguntar qual você deseja.fonte
into_iter()
é o que consome o vetor;drain
é diferente, pois apenas esvazia o vetor.