I am playing with Rust, and I\'m trying to access the first command line argument with this code:
use std::env;
fn main() {
let args: Vec<_> = env
When you use an index operator ([]
) 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 String
s which is then collected into a Vec<String>
. 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:
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");
}