Rust 中的命令行参数解析

RustRustBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,我们有一个在 Rust 中使用模式匹配进行参数解析的示例。该程序接受命令行参数,并根据传递的参数数量和类型执行不同的操作。如果没有传递参数,它会打印一条消息。如果传递了一个参数并且可以将其解析为整数 42,它会打印 “这就是答案!”。如果传递了一个命令和一个整数参数,它会对该整数执行增加或减少操作。如果传递了任何其他数量的参数,它会显示一条帮助消息,解释程序的正确用法。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用 main.rs,并通过 rustc main.rs &&./main 进行编译和运行。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) 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{{"Rust 中的命令行参数解析"}} rust/integer_types -.-> lab-99279{{"Rust 中的命令行参数解析"}} rust/string_type -.-> lab-99279{{"Rust 中的命令行参数解析"}} rust/function_syntax -.-> lab-99279{{"Rust 中的命令行参数解析"}} rust/expressions_statements -.-> lab-99279{{"Rust 中的命令行参数解析"}} rust/lifetime_specifiers -.-> lab-99279{{"Rust 中的命令行参数解析"}} rust/method_syntax -.-> lab-99279{{"Rust 中的命令行参数解析"}} rust/operator_overloading -.-> lab-99279{{"Rust 中的命令行参数解析"}} end

参数解析

匹配可用于解析简单参数:

use std::env;

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

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

fn help() {
    println!("usage:
match_args <string>
    检查给定字符串是否是答案。
match_args {{increase|decrease}} <整数>
    将给定整数增加或减少一。");
}

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

    match args.len() {
        // 未传递参数
        1 => {
            println!("我叫'match_args'。试试传递一些参数!");
        },
        // 传递了一个参数
        2 => {
            match args[1].parse() {
                Ok(42) => println!("这就是答案!"),
                _ => println!("这不是答案。"),
            }
        },
        // 传递了一个命令和一个参数
        3 => {
            let cmd = &args[1];
            let num = &args[2];
            // 解析数字
            let number: i32 = match num.parse() {
                Ok(n) => {
                    n
                },
                Err(_) => {
                    eprintln!("错误:第二个参数不是整数");
                    help();
                    return;
                },
            };
            // 解析命令
            match &cmd[..] {
                "increase" => increase(number),
                "decrease" => decrease(number),
                _ => {
                    eprintln!("错误:无效命令");
                    help();
                },
            }
        },
        // 所有其他情况
        _ => {
            // 显示帮助信息
            help();
        }
    }
}
$./match_args Rust
这不是答案。
$./match_args 42
这就是答案!
$./match_args do something
错误:第二个参数不是整数
usage:
match_args <string>
    检查给定字符串是否是答案。
match_args {increase|decrease} <整数>
    将给定整数增加或减少一。
$./match_args do 42
错误:无效命令
usage:
match_args <string>
    检查给定字符串是否是答案。
match_args {increase|decrease} <整数>
    将给定整数增加或减少一。
$./match_args increase 42
43

总结

恭喜你!你已经完成了参数解析实验。你可以在 LabEx 中练习更多实验来提升你的技能。