初学rust——I/O Project

Eliza ·
更新时间:2024-09-20
· 942 次阅读

今天是学习rust的第五天,学习材料为官网的《The Rust Programming Language》,本笔记的内容为第12章,I/O project

Chapter 12 I/O project: Building a Command Line Program

Separation of Concerns for Binary Projects

将代码程序分为main.rslib.rs,将程序的逻辑logic移动到lib.rs 当parsing逻辑足够小时可以放在main.rs

main.rs中的函数应该有以下功能:

调用命令行parsing logic 设置其他任何的配置 调用lib.rs中的run函数 若run出现错误,则处理错误

src/main.rs

use std::env; //这个库不支持错误的Unicode编码,如果想要支持则需要std::env::arg_os use std::process; use minigrep::Config; fn main() { let args: Vec = env::args().collect(); //使得命令行工具得以读取任意命令,并且将其传递、转换为一个vector //println!("{:?}", args); let config = Config::new(&args).unwrap_or_else(|err|{ //unwrap_or_else可以帮助我们实现用户化的错误信息返回 println!("Problem parsing arguments: {}", err); process::exit(1); }); //println!("Searching for {}", config.query); //println!("In the file {}", config.filename); //调用run,运行读取文件等操作,main中处理错误:相当于lib中的函数被调用,如果出现错误则把错误抛给main if let Err(e) = minigrep::run(config) { println!("Application error: {}", e); process::exit(1); } }

lib.rs

use std::fs; //处理文件的库 use std::error::Error; use std::env; pub struct Config{ pub query: String, pub filename: String, pub case_sensitive: bool, } pub fn run(config: Config) -> Result<(), Box> { //Box会返回一个类型,实现error trait,且我们不需指明这个类型 let contents = fs::read_to_string(config.filename)?; //问号会从当前的函数返回错误值,给调用者处理 let results = if config.case_sensitive { search(&config.query, &contents) }else{ search_case_insensitive(&config.query, &contents) }; for line in results { println!("{}", line); } Ok(()) } impl Config{ pub fn new(args: &[String]) -> Result{ if args.len() < 3{ //panic!("not enough arguments!"); return Err("not enough arguments!"); } let query = args[1].clone(); let filename = args[2].clone(); let case_sensitive = env::var("CASE_INSENSITIVE").is_err(); //调动env::var来返回一个Result Ok(Config{ query, filename, case_sensitive }) } } #[cfg(test)] mod tests { use super::*; #[test] fn case_sensitive() { let query = "duct"; let contents = "\ Rust: safe, fast, productive. Pick three. Duct tape."; assert_eq!( vec!["safe, fast, productive."], search(query, contents) ); } #[test] fn case_insensitive(){ let query = "rUsT"; let contents = "\ Rust: safe, fast, productive. Pick three. Trust me."; assert_eq!( vec!["Rust:", "Trust me."], search_case_insensitive(query, contents) ); } } pub fn search(query: &str, contents: &'a str) -> Vec{ //检索函数 let mut results = Vec::new(); for line in contents.lines(){ //方法line返回一个iter,查找每一行 if line.contains(query){ results.push(line); } } results } pub fn search_case_insensitive(query: &str, contents: &'a str) -> Vec { let query = query.to_lowercase(); //将query中的内容进行小写化 let mut results = Vec::new(); for line in contents.lines() { if line.to_lowercase().contains(&query) { results.push(line); } } results }

设置环境变量:
CASE_INSENSITIVE=1 cargo run to poem.txt
注意此处我们不关心这个环境变量具体是多少,我们只关心他是否被设置了

peom.txt是文件,里面有一首诗。本章的命令行程序实现了读取文件、大小写敏感\不敏感搜索的任务。上述命令是在poem.txt中搜索关键字to


作者:LiraWang



project rust

需要 登录 后方可回复, 如果你还没有账号请 注册新账号