1. 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 纪元以来的持续时间,并提取秒数。错误处理覆盖了缺少参数和非法格式两种情况,确保程序行为可预期。