println!("! {:?}", why.kind());
});
println!("`rmdir a/c/d`");
fs::remove_dir("a/c/d").unwrap_or_else(|why| {
println!("! {:?}", why.kind());
});
}
Вот ожидаемый результат:
$ rustc fs.rs && ./fs
`mkdir a`
`echo hello > a/b.txt`
`mkdir -p a/c/d`
`touch a/c/e.txt`
`ln -s ../b.txt a/c/b.txt`
`cat a/c/b.txt`
> hello
`ls a`
> "a/b.txt"
> "a/c"
`rm a/c/e.txt`
`rmdir a/c/d`
И конечное состояние директории a:
$ tree a
a
|-- b.txt
`-- c
`-- b.txt -> ../b.txt
1 directory, 2 files
Альтернативный путь определения функции cat - с нотацией ?:
fn cat(path: &Path) -> io::Result
let mut f = File::open(path)?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}
cfg!
Аргументы командной строки могут быть доступны при помощи std::env::args, который возвращает итератор, который выдаёт String для каждого аргумента:
use std::env;
fn main() {
let args: Vec
// Первый аргумент - путь, используемый для вызова программы.
println!("Мой путь {}.", args[0]);
// Оставшиеся аргументы - переданные в командной строке параметры.
// Вызов программы выглядит так:
// $ ./args arg1 arg2
println!("У меня {:?} аргумента: {:?}.", args.len() - 1, &args[1..]);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ ./args 1 2 3
Мой путь ./args.
У меня 3 аргумента: ["1", "2", "3"].
В качестве альтернативы, существует несколько крейтов, которые предоставляют дополнительную функциональность при создании приложений командной сроки. Rust Cookbook показывает лучшие практики, как использовать один из самых популярных крейтов для аргументов командной строки, clap.
Сопоставление может быть использовано для разбора простых аргументов:
use std::env;
fn increase(number: i32) {
println!("{}", number + 1);
}
fn decrease(number: i32) {
println!("{}", number - 1);
}
fn help() {
println!("usage:
match_args
Проверяет является ли данная строка ответом.
match_args {{increase|decrease}}
Увеличивает или уменьшает число на 1.");
}
fn main() {
let args: Vec
match args.len() {
// аргументы не переданы
1 => {
println!("Я - 'match_args'. Попробуйте передать аргументы!");
},
// передан один аргумент
2 => {
match args[1].parse() {
Ok(42) => println!("Это ответ!"),
_ => println!("Это не ответ."),
}
},
// переданы одна команда и один аргумент
3 => {