debugrustCritical
What does "cannot move out of index of" mean?
Viewed 0 times
indexmovedoesmeanoutcannotwhat
Problem
I am playing with Rust, and I'm trying to access the first command line argument with this code:
And I get this error:
Or in later versions of Rust:
If I change it to
use std::env;
fn main() {
let args: Vec = env::args().collect();
let dir = args[1];
}And I get this 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
Or in later versions of Rust:
error[E0507]: cannot move out of index of std::vec::Vec
--> src/main.rs:5:15
|
5 | let dir = args[1];
| ^^^^^^^
| |
| move occurs because value has type std::string::String, which does not implement the Copy trait
| help: consider borrowing here: &args[1]
If I change it to
let ref dir, it compiles, but I don't grok what's going on. Could someone explain what "indexed content" means?Solution
When you use an index operator (
In your example,
You can use a
Implicitly moving out of a
See also:
For your particular problem, you can also just use
[]) you get the actual object at index location. You do not get a reference, pointer or copy. Since you try to bind that object with a let binding, Rust immediately tries to move (or copy, if the Copy trait is implemented).In your example,
env::args() is an iterator of Strings which is then collected into a Vec. This is an owned vector of owned strings, and owned strings are not automatically copyable. You can use a
let ref binding, but the more idiomatic alternative is to take a reference to the indexed object (note the & symbol):use std::env;
fn main() {
let args: Vec = env::args().collect();
let ref dir = &args[1];
// ^
}Implicitly moving out of a
Vec is not allowed as it would leave it in an invalid state — one element is moved out, the others are not. If you have a mutable Vec, you can use a method like Vec::remove to take a single value out:use std::env;
fn main() {
let mut args: Vec = env::args().collect();
let dir = args.remove(1);
}See also:
- What is the return type of the indexing operation?
For your particular problem, you can also just use
Iterator::nth:use std::env;
fn main() {
let dir = env::args().nth(1).expect("Missing argument");
}Code Snippets
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
let ref dir = &args[1];
// ^
}use std::env;
fn main() {
let mut args: Vec<_> = env::args().collect();
let dir = args.remove(1);
}use std::env;
fn main() {
let dir = env::args().nth(1).expect("Missing argument");
}Context
Stack Overflow Q#27904864, score: 114
Revisions (0)
No revisions yet.