当前位置: 首页 > wzjs >正文

建材网站建设公司做网络私活的网站

建材网站建设公司,做网络私活的网站,网站建设 概念,网站设计作品Rust学习之实现命令行小工具minigrep(二) Rust学习之实现命令行小工具minigrep(一) 前言 继续记录一下Rust 语言学习过程,上次写了一个命令行查找字符串的小项目minigrep。学习完了闭包(Closures&#x…

Rust学习之实现命令行小工具minigrep(二)

Rust学习之实现命令行小工具minigrep(一)

前言

继续记录一下Rust 语言学习过程,上次写了一个命令行查找字符串的小项目minigrep。学习完了闭包(Closures)和迭代器(Iterators)之后,我们使用这两个技术来改进minigrep这个项目。

本文源码:代码仓库

改进实现

minigrep1 这个项目中,lib.rs文件,我们对Config的build方法中进行改进。

上次我们的代码如下:


pub struct Config {pub query: String,pub file_path: String,pub ignore_case: bool,
}impl Config {pub fn build(args: &[String]) -> Result<Config, &'static str> { // 1if args.len() < 3 {return Err("Not enouth arguments"); // 传入参数不够}let query = args[1].clone();let file_path = args[2].clone();let ignore_case = env::var("IGNORE_CASE=1").is_ok();Ok(Config {query,file_path,ignore_case})}
}

代码里args: &[String] 表示传进来的是字符串的切片引用,而后面的Config 需要拥有queryfile_path 以及ignore_case。所以在代码中不得不克隆一份。

改进build方法

现在可以使用迭代器(Iterators)代替&[String],对这里build方法进行改进,改进步骤如下:

  1. 直接将env::args() 传入 Config::build 方法,env::args() 返回一个Iterator
  2. build 方法声明中,args 参数类型改为impl Iterator<Item = String>
  3. 使用迭代器的next方法获取元素并使用match语法进行匹配

main.rs


use std::env;
use std::process;use minigrep1::Config;fn main() {let args: Vec<String> = env::args().collect();// dbg!(args); // stderr// 传入两个参数// &args 改为 env::args()let config = Config::build(env::args()).unwrap_or_else(|err| {eprintln!("Problem parsing arguments: {}", err);process::exit(1);});if let Err(e) = minigrep1::run(config) {eprintln!("Application error {}", e);process::exit(1)}
}

lib.rs

改进前:


pub fn build(args: &Vec<String>) -> Result<Config, &'static str> {if args.len() < 3 {return Err("Not enouth arguments"); // 传入参数不够}let query = args[1].clone();let file_path = args[2].clone();
}

改进后:

impl Config {pub fn build(mut args: impl Iterator<Item = String>) -> Result<Config, &'static str> {args.next(); // skip the first argumentlet query = match args.next() {Some(arg) => arg,None => return Err("Didn't get a query string"),};let file_path = match args.next() {Some(arg) => arg,None => return Err("Didn't get a file_path string"),};let ignore_case = env::var("IGNORE_CASE=1").is_ok();Ok(Config {query,file_path,ignore_case})}
}

改进search方法

search方法中,是对文本进行遍历,进行判断查找。这里可以用迭代器,还可以用闭包。contents.lines() 返回一个迭代器

用迭代器把之前的for 循环都替换掉,使用filter时使用闭包

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {contents.lines().filter(|line| line.contains(query)).collect()
}

同理,search_case_insensitive方法也同样使用迭代器和闭包进行修改

改进前:

pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {let mut result = Vec::new();let query = query.to_lowercase();for line in contents.lines() {if line.to_lowercase().contains(&query) {result.push(line);}}result
}

改进后:

pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {let query: String = query.to_lowercase();contents.lines().filter(|line| line.to_lowercase().contains(&query)).collect()
}

总结

项目使用迭代器和闭包优化之后首先代码效率提高了,为了将引用切片转移到Config中需要使用消耗性能的clone方法,现在我们就不需要了。迭代器迭代适配器filter 方法的使用让我们编写更加简明的代码。


文章转载自:

http://q6vM7oLG.nytgk.cn
http://YeoUmFHB.nytgk.cn
http://GEc2b42P.nytgk.cn
http://2kU8z4Jl.nytgk.cn
http://AUcYZmPe.nytgk.cn
http://6ovfwCiM.nytgk.cn
http://Z2hsA5YQ.nytgk.cn
http://uguiwf87.nytgk.cn
http://UmwjDQFA.nytgk.cn
http://qy7vafS4.nytgk.cn
http://m5GjLkLd.nytgk.cn
http://Qh2tlcAz.nytgk.cn
http://xXTvAZvF.nytgk.cn
http://TSf377LK.nytgk.cn
http://K1d7sfn0.nytgk.cn
http://RxKBzpcz.nytgk.cn
http://UPgVimJx.nytgk.cn
http://q8CHhHPe.nytgk.cn
http://mJx1wPto.nytgk.cn
http://FOCLXCZM.nytgk.cn
http://8virRLza.nytgk.cn
http://podb2f7j.nytgk.cn
http://OnMwtQ03.nytgk.cn
http://GzPLGr0c.nytgk.cn
http://ja6H2IXY.nytgk.cn
http://I7ndjn7g.nytgk.cn
http://ehaIRUC7.nytgk.cn
http://8ahWcnz6.nytgk.cn
http://AuwBg1Oy.nytgk.cn
http://zIu3lNz0.nytgk.cn
http://www.dtcms.com/wzjs/760641.html

相关文章:

  • ppt怎么做网站怎么建网站不用买空间
  • 百科网站源码手机端网站尺寸规范
  • 做京东一样的网站网站 建设 拖拉 源码 系统
  • 凡科网站怎么做淘宝客朗格手表网站
  • 济南网站推广排名怎么样自己做网站接订单
  • 学校网站建设的目的个人建网站的步骤
  • 网站不能上传图片江苏恒博网络推广有限公司
  • 装饰网站方案互联网十大上市公司
  • 全球搜索引擎网站三个字公司名字大全 必过
  • 厦门网站建设满山红陵水网站建设
  • 网站域名注册费用做酒类网站
  • wordpress 主题乱了四川网站推广优化
  • 黔东南网站开发gzklyy有做酒席酒水网站吗
  • 微信的官方首页seo免费工具
  • 天津教育网站官网哪个网站可以悬赏做图
  • 乐清网站设计制作网站开发厂商
  • 怎么给公司网站上放视频重庆新闻发布会直播
  • 不动产登记门户网站建设大理悦花轩客栈在哪些网站做推广
  • 微信公众号的模板网站网站建设提案怎么写
  • 网站运营的概念一个人可以做几个网站负责人
  • 聊城网站建设价格江苏建设管理信息网站
  • 苏州做网站公司速找苏州聚尚网络wordpress 客户端管理
  • 厦门哪里有做网站官方网站建设项目询价
  • 网站后台下载海尔网站建设内容策划
  • 学习php做毕设网站方向合肥网站建设培训班
  • 彩票做的最好是个网站好成品app直播源码有什么用
  • 南山商城网站建设哪家技术好东莞优化排名推广
  • 福州高端网站建设服务网络公司wordpress板娘插件
  • 中国古风网站模板海外 国内网站建设
  • 设计公司啊 网站移动做绩效的网站