为了确保 minigrep 能够获取传递给它的命令行参数的值,我们需要一个 Rust 标准库提供的函数,也就
是 std:: env::args。这个函数返回一个传递给程序的命令行参数的 迭代器(iterator)。我们会在 第十三
章 全面的介绍它们。但是现在只需理解迭代器的两个细节:迭代器生成一系列的值,可以在迭代器上调
用 collect 方法将其转换为一个集合,比如包含所有迭代器产生元素的 vector。
use std::env;
fn main() {
let args: Vec = env::args().collect();
println!(“{:?}”, args);
}
示例 12-1:将命令行参数收集到一个 vector 中并打印出来
首先使用 use 语句来将 std:: env 模块引入作用域以便可以使用它的 args 函数。注意 std:: env::args 函
数被嵌套进了两层模块中。正如 第七章 讲到的,当所需函数嵌套了多于一层模块时,通常将父模块引入
作用域,而不是其自身。这便于我们利用 std:: env 中的其他函数。这比增加了 use std::env::args; 后仅
仅使用 args 调用函数要更明确一些,因为 args 容易被错认成一个定义于当前模块的函数。
args 函数和无效的 Unicode
注意 std:: env::args 在其任何参数包含无效 Unicode 字符时会 panic。如果你需要接受包含无效
Unicode 字符的参数,使用 std:: env::args_os 代替。这个函数返回 OsString 值而不是 String 值。
这里出于简单考虑使用了 std:: env::args,因为 OsString 值每个平台都不一样而且比 String 值处理
起来更为复杂。
在 main 函数的第一行,我们调用了 env::args,并立即使用 collect 来创建了一个包含迭代器所有值的
vector。collect 可以被用来创建很多类型的集合,所以这里显式注明 args 的类型来指定我们需要一个
字符串 vector。虽然在 Rust 中我们很少会需要注明类型,然而 collect 是一个经常需要注明类型的函
数,因为 Rust 不能推断出你想要什么类型的集合。
最后,我们使用调试格式 :? 打印出 vector。让我们尝试分别用两种方式(不包含参数和包含参数)运行
代码:
$ cargo run
Compiling minigrep v0.1.0 (file:///projects/minigrep)
Finished dev [unoptimized + debuginfo] target(s) in 0.61s
Running target/debug/minigrep
[“target/debug/minigrep”]
$ cargo run needle haystack
Compiling minigrep v0.1.0 (file:///projects/minigrep)
Finished dev [unoptimized + debuginfo] target(s) in 1.57s
Running target/debug/minigrep needle haystack
[“target/debug/minigrep”, “needle”, “haystack”]
注意 vector 的第一个值是 ”target∕debug∕minigrep”,它是我们二进制文件的名称。这与 C 中的参数列
表的行为相匹配,让程序使用在执行时调用它们的名称。如果要在消息中打印它或者根据用于调用程序
的命令行别名更改程序的行为,通常可以方便地访问程序名称,不过考虑到本章的目的,我们将忽略它
并只保存所需的两个参数。
Rust从入门到实战系列一百二十:读取参数值
最新推荐文章于 2024-03-19 15:34:43 发布