Dostęp do argumentów wiersza poleceń można uzyskać za pomocą funkcji std::env::args
lub std::env::args_os
. Obie funkcje zwracają iterator po argumentach. Pierwsza iteruje po String
s (z którymi łatwo się pracuje), ale panikuje, jeśli jeden z argumentów nie jest poprawnym kodem Unicode. Ten ostatni powtarza OsString
si i nigdy nie panikuje.
Zauważ, że pierwszym elementem iteratora jest nazwa samego programu (jest to konwencja we wszystkich głównych systemach operacyjnych), więc pierwszy argument jest w rzeczywistości drugim iterowanym elementem.
Prostym sposobem radzenia sobie z wynikiem args
jest przekonwertowanie go na Vec
:
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() > 1 {
println!("The first argument is {}", args[1]);
}
}
Możesz użyć całego standardowego zestawu narzędzi iteratora do pracy z tymi argumentami. Na przykład, aby pobrać tylko pierwszy argument:
use std::env;
fn main() {
if let Some(arg1) = env::args().nth(1) {
println!("The first argument is {}", arg1);
}
}
Możesz znaleźć biblioteki na crates.io do analizowania argumentów wiersza poleceń:
- docopt : po prostu piszesz wiadomość pomocy, a kod parsowania jest generowany dla Ciebie.
- clap : opisujesz opcje, które chcesz przeanalizować za pomocą płynnego interfejsu API. Szybszy niż docopt i zapewnia większą kontrolę.
- getopts : port popularnej biblioteki C. Niższy poziom i jeszcze większa kontrola.
- structopt : zbudowany na klapie , jest jeszcze bardziej ergonomiczny w użyciu.
println(args[0])
Docopt jest również dostępny dla Rusta, który generuje parser na podstawie ciągu znaków użycia. Jako bonus w Rust można użyć makra do automatycznego generowania struktury i dekodowania na podstawie typu:
I możesz uzyskać argumenty za pomocą:
README i dokumentacja zawierają wiele pełnych przykładów roboczych.
Zastrzeżenie: jestem jednym z autorów tej biblioteki.
źródło
Rust ma
getopt
parsowanie argumentów CLI w stylu-stylu w skrzynce getopts .źródło
Dla mnie getopts zawsze wydawały się zbyt niskie, a docopt.rs było zbyt magiczne. Chcę czegoś wyraźnego i prostego, co nadal zapewnia wszystkie funkcje, jeśli ich potrzebuję.
Tutaj przydaje się clap-rs .
To trochę jak argparse z Pythona. Oto przykład, jak to wygląda:
Możesz uzyskać dostęp do swoich parametrów w następujący sposób:
(Skopiowane z oficjalnej dokumentacji )
źródło
Od wersji 0.8 / 0.9 poprawna ścieżka do funkcji args () będzie wyglądać następująco
::std::os::args
:Wygląda na to, że Rust jest nadal dość niestabilny, nawet przy standardowym IO, więc może się dość szybko zdezaktualizować.
źródło
Rdza znowu się zmieniła.
os::args()
jest przestarzały na korzyśćstd::args()
. Alestd::args()
nie jest tablicą, zwraca iterator . Możesz iterować po argumentach wiersza poleceń, ale nie możesz uzyskać do nich dostępu za pomocą indeksów dolnych.http://doc.rust-lang.org/std/env/fn.args.html
Jeśli chcesz, aby argumenty wiersza poleceń były wektorami ciągów, zadziała to teraz:
Rdza - naucz się przyjmować ból zmiany.
źródło
env::args().collect()
.to, co powiedział @barjak, działa dla łańcuchów, ale jeśli potrzebujesz argumentu jako liczby (w tym przypadku uint), musisz przekonwertować w ten sposób:
źródło
Sprawdź również structopt:
https://github.com/TeXitoi/structopt
źródło
Od nowszych wersji Rusta (Rust> 0,10 / 11) składnia tablicy nie będzie działać. Będziesz musiał użyć metody get.[Edytuj] Składnia tablicy działa (ponownie) w nocy. Możesz więc wybrać między indeksem pobierającym lub indeksem tablicy.
źródło
Vec
s. Myślę, że jest tam przez miesiąc. Zobacz ten przykład .Rust ewoluował od czasu odpowiedzi Calvina z maja 2013 r. Teraz można przeanalizować argumenty wiersza poleceń za pomocą
as_slice()
:źródło
as_slice()
już nie istnieje i&args
powinno być używane zamiast tego.Rozdział książki Rust „No stdlib” opisuje, jak uzyskać dostęp do parametrów wiersza poleceń (w inny sposób).
Teraz przykład ma również,
#![no_std]
co, jak sądzę, oznacza, że normalnie biblioteka std miałaby prawdziwy punkt wejścia dla twojego pliku binarnego i wywołałaby funkcję globalną o nazwiemain()
. Inną opcją jest „wyłączeniemain
podkładki” za pomocą#![no_main]
. Co, jeśli się nie mylę, oznacza powiedzenie kompilatorowi, że przejmujesz pełną kontrolę nad sposobem uruchamiania programu.Nie sądzę, żeby to był „dobry” sposób robienia rzeczy, jeśli chcesz tylko czytać argumenty wiersza poleceń.
std::os
Moduł wspomniano w innych odpowiedzi wydaje się być o wiele lepszy sposób robienia rzeczy. W celu uzupełnienia zamieszczam tę odpowiedź.źródło