Vous pouvez accéder aux arguments de la ligne de commande à l'aide des fonctions std::env::args
ou std::env::args_os
. Les deux fonctions renvoient un itérateur sur les arguments. Le premier itère sur String
s (avec lesquels il est facile de travailler) mais panique si l'un des arguments n'est pas unicode valide. Ce dernier itère sur OsString
s et ne panique jamais.
Notez que le premier élément de l'itérateur est le nom du programme lui-même (c'est une convention dans tous les principaux systèmes d'exploitation), donc le premier argument est en fait le deuxième élément itéré.
Un moyen simple de gérer le résultat de args
est de le convertir en Vec
:
use std::env;
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() > 1 {
println!("The first argument is {}", args[1]);
}
}
Vous pouvez utiliser toute la boîte à outils de l'itérateur standard pour travailler avec ces arguments. Par exemple, pour récupérer uniquement le premier argument:
use std::env;
fn main() {
if let Some(arg1) = env::args().nth(1) {
println!("The first argument is {}", arg1);
}
}
Vous pouvez trouver des bibliothèques sur crates.io pour analyser les arguments de ligne de commande:
- docopt : il vous suffit d'écrire le message d'aide et le code d'analyse est généré pour vous.
- clap : vous décrivez les options que vous souhaitez analyser à l'aide d'une API fluide. Plus rapide que docopt et vous donne plus de contrôle.
- getopts : port de la bibliothèque C populaire. Niveau inférieur et encore plus de contrôle.
- structopt : construit sur clap, il est encore plus ergonomique à utiliser.
println(args[0])
Docopt est également disponible pour Rust, qui génère un analyseur pour vous à partir d'une chaîne d'utilisation. En prime dans Rust, une macro peut être utilisée pour générer automatiquement la structure et effectuer un décodage basé sur le type:
Et vous pouvez obtenir les arguments avec:
Le README et la documentation contiennent de nombreux exemples de travail complets.
Avertissement: je suis l'un des auteurs de cette bibliothèque.
la source
Rust a
getopt
une analyse de l'argument CLI de style -style dans la caisse getopts .la source
Pour moi, getopts me semblait toujours trop bas et docopt.rs était trop magique. Je veux quelque chose d'explicite et de simple qui fournit toujours toutes les fonctionnalités si j'en ai besoin.
C'est là que clap-rs est utile.
Cela ressemble un peu à argparse de Python. Voici un exemple de son apparence:
Vous pouvez accéder à vos paramètres comme ceci:
(Copié de la documentation officielle )
la source
À partir de la version 0.8 / 0.9, le chemin correct vers la fonction args () serait
::std::os::args
, c'est-à-dire:Il semble que Rust soit encore assez volatile en ce moment même avec les E / S standard, donc cela peut devenir obsolète assez rapidement.
la source
La rouille a de nouveau changé.
os::args()
est obsolète au profit destd::args()
. Mais cestd::args()
n'est pas un tableau, il renvoie un itérateur . Vous pouvez parcourir les arguments de la ligne de commande, mais vous ne pouvez pas y accéder avec des indices.http://doc.rust-lang.org/std/env/fn.args.html
Si vous voulez que les arguments de ligne de commande soient un vecteur de chaînes, cela fonctionnera maintenant:
Rust - apprenez à accepter la douleur du changement.
la source
env::args().collect()
.ce que @barjak a dit fonctionne pour les chaînes, mais si vous avez besoin de l'argument sous forme de nombre (dans ce cas, un uint), vous devez convertir comme ceci:
la source
Consultez également structopt:
https://github.com/TeXitoi/structopt
la source
À partir des nouvelles versions de Rust (Rust> 0.10 / 11), la syntaxe du tableau ne fonctionnera pas. Vous devrez utiliser la méthode get.[Modifier] La syntaxe du tableau fonctionne (à nouveau) dans la nuit. Vous pouvez donc choisir entre l'index getter ou le tableau.
la source
Vec
s. Je suppose que c'est là depuis un mois environ. Voyez cet exemple .Rust a évolué depuis la réponse de Calvin de mai 2013. Maintenant, on analyserait les arguments de ligne de commande avec
as_slice()
:la source
as_slice()
n'existe plus et&args
devrait être utilisé à la place.Le chapitre "No stdlib" du livre Rust explique comment accéder aux paramètres des lignes de commande (d'une autre manière).
Maintenant, l'exemple a également
#![no_std]
ce qui, je pense, signifie que normalement, la bibliothèque std aurait le vrai point d'entrée pour votre binaire et appellerait une fonction globale appeléemain()
. Une autre option consiste à «désactiver lemain
shim» avec#![no_main]
. Ce qui, si je ne me trompe pas, c'est dire au compilateur que vous prenez le contrôle total du démarrage de votre programme.Je ne pense pas que ce soit une «bonne» façon de faire les choses si tout ce que vous voulez faire est de lire les arguments de la ligne de commande. Le
std::os
module mentionné dans d'autres réponses semble être une bien meilleure façon de faire les choses. Je poste cette réponse par souci de finition.la source