1. Hello World 变体

Hello World 变体 学习卡片

任务说明

编写一个 Rust 程序,实现三种问候语输出格式:普通文本、带 ANSI 颜色、带时间戳。程序通过命令行参数选择格式,并接受可选的问候对象名称,默认问候 "World"。

代码实现

use std::env;
use std::process::exit;
use std::time::{SystemTime, UNIX_EPOCH};

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

    // 解析参数:第一个参数为格式,第二个可选为名称
    let format = match args.get(1) {
        Some(f) => f.as_str(),
        None => {
            eprintln!("用法: hello_world <plain|color|time> [名称]");
            exit(1);
        }
    };

    let name = args.get(2).map(String::as_str).unwrap_or("World");

    match format {
        "plain" => println!("Hello, {}!", name),
        "color" => {
            // ANSI 绿色前景色
            println!("\x1b[32mHello, {}!\x1b[0m", name);
        }
        "time" => {
            let now = SystemTime::now()
                .duration_since(UNIX_EPOCH)
                .expect("系统时间早于 UNIX 纪元");
            println!("[{}] Hello, {}!", now.as_secs(), name);
        }
        _ => {
            eprintln!("未知格式: {}(可选 plain|color|time)", format);
            exit(1);
        }
    }
}

编译与运行

# 编译
rustc hello_world.rs -o hello_world

# 运行示例
./hello_world plain          # 输出: Hello, World!
./hello_world plain Rust     # 输出: Hello, Rust!
./hello_world color          # 输出绿色: Hello, World!
./hello_world time           # 输出: [1712345678] Hello, World!

验证方法

依次执行上述四条运行命令,观察输出:

  • plain 模式输出无修饰的普通文本;
  • color 模式在支持 ANSI 的终端中显示绿色文本(肉眼可见颜色差异);
  • time 模式输出以方括号包裹的 Unix 时间戳(秒级),后接问候语;
  • 传入第二个参数时,问候对象替换为指定名称;
  • 不传参数或传入非法格式时,程序打印错误提示并以非零状态码退出。

判定标准:三种格式均能正确输出对应内容,且时间戳数值为当前系统时间的 Unix 秒数(与 date +%s 结果误差在 1 秒内)。

代码说明

程序使用 std::env::args 获取命令行参数,通过 match 分支处理三种格式。颜色输出使用 ANSI 转义序列 \x1b[32m(绿色)与 \x1b[0m(重置)。时间戳通过 SystemTime::now() 获取自 UNIX 纪元以来的持续时间,并提取秒数。错误处理覆盖了缺少参数和非法格式两种情况,确保程序行为可预期。

命令行参数解析与输出流程 args[1] 格式 args[2] 名称 match format plain | color | time _ => 错误退出 println! 普通文本 ANSI 绿色输出 时间戳 + 问候语 exit(1)