二、创建新项目
和以前一样,我们找个地方,打开 终端
运行以下新建项目的命令,
cargo new minigrep
然后使用vscode打开minigrep文件夹,里面就是cargo为我们创建好的基础项目。
三、读取参数值
Rust 标准库提供了一个函数std::env::args
,返回一个传递给程序的命令行参数的 迭代器
,迭代器
我们在后面会详细介绍,现在你只需记住两件事:
- 迭代器生成一系列的值
- 可以在迭代器上调用
collect
方法将其转换为一个集合
我们将传递给程序的命令行参数读取并收集到 vector
中,先导入标准库
use std::env;
然后在 main
中接收该参数,并且调用 collect
方法接收参数,并且存入变量 args
中
let args: Vec<String> = env::args().collect();
完整代码如下
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
println!("{:#?}", args);
}
接下来我们使用 cargo run
传入参数运行程序看看效果,
cargo run needle haystack
运行效果如下图所示,可以看到,接收到的参数一共有三个,
第一个参数是:二进制文件的名称,也是位置。后面的参数就是我们输入的参数,我们传入的参数一共有两个,但是这里给出了三个参数,这是没有问题的,传入的参数第一个是文件名,接下来才我们传入的参数
四、将参数保存至变量
由于我们将参数存入了 Vector
的变量 args
中,并且我们已知参数的数量和含义是什么,利用以前学过的知识,取到这两个参数
let query = &args[1];
let filename = &args[2];
完整代码
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
println!("{:#?}", args);
let query = &args[1];
let filename = &args[2];
println!("Searching for {}", query);
println!("In file {}", filename);
}
现在运行试试效果,如下图示
五、读取文件
1. 新建文本文件
在项目目录新建文本文件,如下图所示,实际情况任意,本次仅作为例子,
文件内容如下:
中山孺子妾,特以色见珍。虽然不如延年妹,亦是当时绝世人。
桃李出深井,花艳惊上春。一贵复一贱,关天岂由身。
芙蓉老秋霜,团扇羞网尘。戚姬髡发入舂市,万古共悲辛。
2. 导入文件操作函数
文件操作是在标准库中的std::fs
下提供的,使用之前我们需要将这些函数导入进来,代码如下:
use std::fs;
3. 读取文件内容
fs::read_to_string
是一个读取文件内容的函数,需要接收 filename
,返回 Result<String>
,其中包含文件内容。
在上一小节的代码基础之上,我们进行修改。上节代码
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
println!("{:#?}", args);
let query = &args[1];
let filename = &args[2];
println!("搜索 {}", query);
println!("在文件 {}", filename);
}
我们已经从命令行参数中读取到了 filename
,因此我们只需要将这个参数传递给 fs::read_to_string
就得以得到我们要的文件内容,拿到文件内容以后输出文件内容。
现在我们加入以下代码
let contents = fs::read\_to\_string(filename)
.expect("读取文件出错");
println!("读取到的文本为:\n{}", contents);
完整代码:
use std::env;
use std::fs;
fn main() {
let args: Vec<String> = env::args().collect();
println!("{:#?}", args);
let query = &args[1];
let filename = &args[2];
println!("搜索 {}", query);
println!("在文件 {}", filename);
let contents = fs::read\_to\_string(filename)
.expect("读取文件出错");
println!("读取到的文本为:\n{}", contents);
}
4. 运行效果
现在我们在终端执行命令,
cargo run the poem.txt
效果如下,
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!