Rust从入门到实战系列一百二十一:将参数值保存进变量

打印出参数 vector 中的值展示了程序可以访问指定为命令行参数的值。现在需要将这两个参数的值保存
进变量这样就可以在程序的余下部分使用这些值了。让我们如示例 12-2 这样做:
use std::env;
fn main() {
let args: Vec = env::args().collect();
let query = &args[1];
let filename = &args[2];
println!(“Searching for {}”, query);
println!(“In file {}”, filename);
}
创建变量来存放查询参数和文件名参数
正如之前打印出 vector 时所所看到的,程序的名称占据了 vector 的第一个值 args[0],所以我们从索
引 1 开始。minigrep 获取的第一个参数是需要搜索的字符串,所以将其将第一个参数的引用存放在变量
query 中。第二个参数将是文件名,所以将第二个参数的引用放入变量 filename 中。
我们将临时打印出这些变量的值来证明代码如我们期望的那样工作。使用参数 test 和 sample.txt 再次
运行这个程序:
$ cargo run test sample.txt
Compiling minigrep v0.1.0 (file:///projects/minigrep)
Finished dev [unoptimized + debuginfo] target(s) in 0.0s
Running target/debug/minigrep test sample.txt
Searching for test
In file sample.txt
好的,它可以工作!我们将所需的参数值保存进了对应的变量中。之后会增加一些错误处理来应对类似用户没有提供参数的情况,不过现在我们将忽略他们并开始增加读取文件功能。
读取文件
ch12-02-reading-a-file.md
commit 0f87daf683ae3de3cb725faecb11b7e7e89f0e5a
现在我们要增加读取由 filename 命令行参数指定的文件的功能。首先,需要一个用来测试的示例文
件:用来确保 minigrep 正常工作的最好的文件是拥有多行少量文本且有一些重复单词的文件。示例
12-3 是一首艾米莉・狄金森(Emily Dickinson)的诗,它正适合这个工作!在项目根目录创建一个文件
poem.txt,并输入诗 ”I’m nobody! Who are you?”:
I’m nobody! Who are you?
Are you nobody, too?
Then there’s a pair of us - don’t tell!
They’d banish us, you know.
How dreary to be somebody!
How public, like a frog
To tell your name the livelong day
To an admiring bog!
艾米莉・狄金森的诗 ”I’m nobody! Who are you?”,一个好的测试用例
创建完这个文件之后,修改 src∕main.rs 并增加如示例 12-4 所示的打开文件的代码:
use std::env;
use std::fs;
fn main() {
// --snip–

let args: Vec = env::args().collect();

let query = &args[1];

let filename = &args[2];

println!(“Searching for {}”, query);

println!(“In file {}”, filename);
let contents = fs::read_to_string(filename)
.expect(“Something went wrong reading the file”);
println!(“With text:\n{}”, contents);
}
读取第二个参数所指定的文件内容
首先,我们增加了一个 use 语句来引入标准库中的相关部分:我们需要 std:: fs 来处理文件。
在 main 中新增了一行语句:fs :: read_to_string 接受 filename,打开文件,接着返回包含其内容的
Result。
在这些代码之后,我们再次增加了临时的 println! 打印出读取文件之后 contents 的值,这样就可以检
查目前为止的程序能否工作。
尝试运行这些代码,随意指定一个字符串作为第一个命令行参数(因为还未实现搜索功能的部分)而将
poem.txt 文件将作为第二个参数:
$ cargo run the poem.txt
Compiling minigrep v0.1.0 (file:///projects/minigrep)
Finished dev [unoptimized + debuginfo] target(s) in 0.0s
Running target/debug/minigrep the poem.txt
Searching for the
In file poem.txt
With text:
I’m nobody! Who are you?
Are you nobody, too?
Then there’s a pair of us - don’t tell!
They’d banish us, you know.
How dreary to be somebody!
How public, like a frog
To tell your name the livelong day
To an admiring bog!
好的!代码读取并打印出了文件的内容。虽然它还有一些瑕疵:main 函数有着多个职能,通常函数只负
责一个功能的话会更简洁并易于维护。另一个问题是没有尽可能的处理错误。虽然我们的程序还很小,
这些瑕疵并不是什么大问题,不过随着程序功能的丰富,将会越来越难以用简单的方法修复他们。在
开发程序时,及早开始重构是一个最佳实践,因为重构少量代码时要容易的多,所以让我们现在就开始吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值