Rust从入门到实战系列一百二十:读取参数值

为了确保 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 中的参数列
表的行为相匹配,让程序使用在执行时调用它们的名称。如果要在消息中打印它或者根据用于调用程序
的命令行别名更改程序的行为,通常可以方便地访问程序名称,不过考虑到本章的目的,我们将忽略它
并只保存所需的两个参数。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值