¿Qué significa “no se puede mover del contenido indexado”?

Estoy jugando con Rust , y estoy tratando de acceder al primer argumento de línea de comando con este código:

use std::env; fn main() { let args: Vec = env::args().collect(); let dir = args[1]; } 

Y obtengo este error:

 error[E0507]: cannot move out of indexed content --> src/main.rs:5:15 | 5 | let dir = args[1]; | --- ^^^^^^^ cannot move out of indexed content | | | hint: to prevent move, use `ref dir` or `ref mut dir` 

Si lo cambio para let ref dir , se comstack, pero no entiendo lo que está pasando. ¿Podría alguien explicar qué significa “contenido indexado”?

Cuando utiliza un operador de índice ( [] ) obtiene el objeto real en la ubicación del índice. No obtiene una referencia, puntero o copia. Como intenta vincular ese objeto con un enlace de let , Rust intenta inmediatamente moverse (o copiar, si se implementa el rasgo de Copy ).

En su ejemplo, env::args() es un iterador de String s que luego se recostack en un Vec . Este es un vector propiedad de cadenas propias y las cadenas propiedad no se pueden copiar automáticamente.

Puede usar un enlace de let ref , pero la alternativa más idiomática es tomar una referencia al objeto indexado (observe el símbolo & ):

 use std::env; fn main() { let args: Vec<_> = env::args().collect(); let ref dir = &args[1]; // ^ } 

No se permite el movimiento implícito de un Vec ya que lo dejaría en un estado inválido: un elemento se mueve y los otros no. Si tiene un Vec mutable, puede usar un método como Vec::remove para quitar un único valor:

 use std::env; fn main() { let mut args: Vec<_> = env::args().collect(); let dir = args.remove(1); } 

Para su problema particular, también puede usar Iterator::nth :

 use std::env; fn main() { let dir = env::args().nth(1).expect("Missing argument"); }