Analyse d'arguments de ligne de commande en Rust

RustRustBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous avons un exemple d'analyse d'arguments en utilisant la correspondance de motifs en Rust. Le programme prend des arguments de ligne de commande et effectue différentes opérations en fonction du nombre et du type d'arguments passés. Si aucun argument n'est passé, il affiche un message. Si un seul argument est passé et qu'il peut être analysé comme l'entier 42, il affiche "This is the answer!". Si une commande et un argument entier sont passés, il effectue une opération d'augmentation ou de diminution sur l'entier. Si un nombre quelconque d'autres arguments est passé, il affiche un message d'aide expliquant la bonne utilisation du programme.

Note : Si le laboratoire ne spécifie pas de nom de fichier, vous pouvez utiliser n'importe quel nom de fichier que vous voulez. Par exemple, vous pouvez utiliser main.rs, le compiler et l'exécuter avec rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99279{{"Analyse d'arguments de ligne de commande en Rust"}} rust/integer_types -.-> lab-99279{{"Analyse d'arguments de ligne de commande en Rust"}} rust/string_type -.-> lab-99279{{"Analyse d'arguments de ligne de commande en Rust"}} rust/function_syntax -.-> lab-99279{{"Analyse d'arguments de ligne de commande en Rust"}} rust/expressions_statements -.-> lab-99279{{"Analyse d'arguments de ligne de commande en Rust"}} rust/lifetime_specifiers -.-> lab-99279{{"Analyse d'arguments de ligne de commande en Rust"}} rust/method_syntax -.-> lab-99279{{"Analyse d'arguments de ligne de commande en Rust"}} rust/operator_overloading -.-> lab-99279{{"Analyse d'arguments de ligne de commande en Rust"}} end

Analyse d'arguments

La correspondance peut être utilisée pour analyser des arguments simples :

use std::env;

fn increase(number: i32) {
    println!("{}", number + 1);
}

fn decrease(number: i32) {
    println!("{}", number - 1);
}

fn help() {
    println!("usage:
match_args <string>
    Vérifie si la chaîne donnée est la réponse.
match_args {{increase|decrease}} <integer>
    Augmente ou diminue l'entier donné de 1.");
}

fn main() {
    let args: Vec<String> = env::args().collect();

    match args.len() {
        // aucun argument passé
        1 => {
            println!("My name is'match_args'. Try passing some arguments!");
        },
        // un argument passé
        2 => {
            match args[1].parse() {
                Ok(42) => println!("This is the answer!"),
                _ => println!("This is not the answer."),
            }
        },
        // une commande et un argument passé
        3 => {
            let cmd = &args[1];
            let num = &args[2];
            // analyse le nombre
            let number: i32 = match num.parse() {
                Ok(n) => {
                    n
                },
                Err(_) => {
                    eprintln!("error: second argument not an integer");
                    help();
                    return;
                },
            };
            // analyse la commande
            match &cmd[..] {
                "increase" => increase(number),
                "decrease" => decrease(number),
                _ => {
                    eprintln!("error: invalid command");
                    help();
                },
            }
        },
        // tous les autres cas
        _ => {
            // affiche un message d'aide
            help();
        }
    }
}
$./match_args Rust
This is not the answer.
$./match_args 42
This is the answer!
$./match_args do something
error: second argument not an integer
usage:
match_args <string>
    Vérifie si la chaîne donnée est la réponse.
match_args {increase|decrease} <integer>
    Augmente ou diminue l'entier donné de 1.
$./match_args do 42
error: invalid command
usage:
match_args <string>
    Vérifie si la chaîne donnée est la réponse.
match_args {increase|decrease} <integer>
    Augmente ou diminue l'entier donné de 1.
$./match_args increase 42
43

Sommaire

Félicitations! Vous avez terminé le laboratoire d'Analyse d'arguments. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.