CLI arguments
| env::args | |
| Skip argv0 | |
| Parse numbers | |
| Print usage |
env::args
Every Rust program can read the words typed after its name. The iterator std::env::args yields one String per word, so collect it into a vector and loop over it:
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
for arg in &args {
println!("{}", arg);
}
}
Run the program with extra words and each one is printed on its own line. This pattern is the start of every command line tool in this course.
Skip argv0
The first item is always the program path itself, known as argv0. Real arguments start at index 1, so skip the first item:
use std::env;
fn main() {
let args: Vec<String> = env::args().skip(1).collect();
for arg in &args {
println!("{}", arg);
}
}
Parse numbers
Arguments arrive as text, so convert them when you need numbers. The parse method returns a Result, and unwrap takes the value when the text is valid:
use std::env;
fn main() {
let arg = env::args().nth(1).unwrap();
let n: u32 = arg.parse().unwrap();
println!("doubled: {}", n * 2);
}
The nth(1) call grabs the first real argument. If the user types a number, the program prints twice its value.
Print usage
Always tell the user what you expected when the arguments are wrong. Check the length, print to stderr, and exit with a nonzero status:
use std::env;
use std::process;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
eprintln!("usage: wordfreq <file>");
process::exit(1);
}
}
A usage line is a tiny contract with the user. Lesson 47 turns this pattern into a full wordfreq tool.
Next: Environment variables
Article author: Arthur Isaev