Das Rust-Tutorial erklärt nicht, wie Parameter von der Befehlszeile übernommen werden. fn main()
wird in allen Beispielen nur mit einer leeren Parameterliste angezeigt.
Wie kann über Befehlszeilenparameter korrekt zugegriffen werden main
?
quelle
Das Rust-Tutorial erklärt nicht, wie Parameter von der Befehlszeile übernommen werden. fn main()
wird in allen Beispielen nur mit einer leeren Parameterliste angezeigt.
Wie kann über Befehlszeilenparameter korrekt zugegriffen werden main
?
Sie können auf die Befehlszeilenargumente zugreifen, indem Sie die Funktionen std::env::args
oder std::env::args_os
verwenden. Beide Funktionen geben einen Iterator über die Argumente zurück. Ersteres iteriert über String
s (die leicht zu bearbeiten sind), gerät jedoch in Panik, wenn eines der Argumente kein gültiger Unicode ist. Letzteres iteriert über OsString
s und gerät nie in Panik.
Beachten Sie, dass das erste Element des Iterators der Name des Programms selbst ist (dies ist eine Konvention in allen wichtigen Betriebssystemen), sodass das erste Argument tatsächlich das zweite iterierte Element ist.
Eine einfache Möglichkeit, mit dem Ergebnis von umzugehen, args
besteht darin, es in Folgendes umzuwandeln Vec
:
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() > 1 {
println!("The first argument is {}", args[1]);
}
}
Sie können die gesamte Standard-Iterator-Toolbox verwenden , um mit diesen Argumenten zu arbeiten. Um beispielsweise nur das erste Argument abzurufen:
use std::env;
fn main() {
if let Some(arg1) = env::args().nth(1) {
println!("The first argument is {}", arg1);
}
}
Auf crates.io finden Sie Bibliotheken zum Parsen von Befehlszeilenargumenten:
println(args[0])
Docopt ist auch für Rust verfügbar, das aus einer Verwendungszeichenfolge einen Parser für Sie generiert. Als Bonus in Rust kann ein Makro verwendet werden, um die Struktur automatisch zu generieren und eine typbasierte Dekodierung durchzuführen:
Und Sie können die Argumente bekommen mit:
Die README-Datei und die Dokumentation enthalten zahlreiche vollständige Arbeitsbeispiele.
Haftungsausschluss: Ich bin einer der Autoren dieser Bibliothek.
quelle
Rust hat ein
getopt
CLI-Argument im Stil, das in der getopts-Kiste analysiert wird .quelle
Getopts fühlte sich für mich immer zu niedrig an und docopt.rs war zu viel Magie. Ich möchte etwas Explizites und Unkompliziertes, das immer noch alle Funktionen bietet, wenn ich sie brauche.
Hier bietet sich das Klatschen an.
Es fühlt sich ein bisschen wie Argparse aus Python an. Hier ist ein Beispiel, wie es aussieht:
Sie können wie folgt auf Ihre Parameter zugreifen:
(Aus der offiziellen Dokumentation kopiert )
quelle
Ab Version 0.8 / 0.9 wäre der korrekte Pfad zur Funktion args ()
::std::os::args
:Es scheint, dass Rust derzeit selbst mit Standard-E / A noch ziemlich volatil ist, so dass dies ziemlich schnell veraltet sein kann.
quelle
Rust änderte sich wieder.
os::args()
wird zugunsten von abgelehntstd::args()
. Iststd::args()
aber kein Array, gibt es einen Iterator zurück . Sie können über die Befehlszeilenargumente iterieren, jedoch nicht mit Indizes darauf zugreifen.http://doc.rust-lang.org/std/env/fn.args.html
Wenn Sie die Befehlszeilenargumente als Vektor von Zeichenfolgen verwenden möchten, funktioniert dies jetzt:
Rost - lernen Sie, den Schmerz der Veränderung anzunehmen.
quelle
env::args().collect()
.Was @barjak gesagt hat, funktioniert für Zeichenfolgen, aber wenn Sie das Argument als Zahl (in diesem Fall als Uint) benötigen, müssen Sie Folgendes konvertieren:
quelle
Schauen Sie sich auch structopt an:
https://github.com/TeXitoi/structopt
quelle
Ab neueren Rust-Versionen (Rust> 0.10 / 11) funktioniert die Array-Syntax nicht mehr. Sie müssen die get-Methode verwenden.[Bearbeiten] Die Array-Syntax funktioniert (wieder) in der Nacht. Sie können also zwischen dem Getter- oder dem Array-Index wählen.
quelle
Vec
s. Ich denke, es ist ungefähr einen Monat lang da. Siehe dieses Beispiel .Rust hat sich seit Calvins Antwort vom Mai 2013 weiterentwickelt. Nun würde man Befehlszeilenargumente analysieren mit
as_slice()
:quelle
as_slice()
existiert nicht mehr und&args
sollte stattdessen verwendet werden.Das Kapitel "No stdlib" im Rust-Buch behandelt den Zugriff auf die Befehlszeilenparameter (auf andere Weise).
Das Beispiel hat auch das,
#![no_std]
was meiner Meinung nach bedeutet, dass die Standardbibliothek normalerweise den wahren Einstiegspunkt für Ihre Binärdatei hat und eine globale Funktion namens aufruftmain()
. Eine andere Möglichkeit besteht darin, diemain
Unterlegscheibe mit zu deaktivieren#![no_main]
. Wenn ich mich nicht irre, sagt das dem Compiler, dass Sie die volle Kontrolle darüber haben, wie Ihr Programm gestartet wird.Ich denke nicht, dass dies eine 'gute' Art ist, Dinge zu tun, wenn Sie nur Befehlszeilenargumente lesen möchten. Das
std::os
in anderen Antworten erwähnte Modul scheint eine viel bessere Möglichkeit zu sein, Dinge zu tun. Ich poste diese Antwort zum Zwecke der Vervollständigung.quelle