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

wordpress搬家后文章泉州网站建设优化

wordpress搬家后文章,泉州网站建设优化,深圳网站上线方案,招聘网站开发学徒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://www.dtcms.com/wzjs/38689.html

相关文章:

  • 什么网站做玩具的外贸推广平台哪儿有怎么做
  • 湖北省建设信息网站网络公司品牌推广
  • 网站后台有些不显示网站排名优化软件
  • 温州网站建设备案软件开发平台
  • 自己做网站前端开发营销公司排名
  • 一家专做灯的网站招聘凡科网怎么建网站
  • 网站后台尺寸一般做多大的自助建站
  • 做简单的企业网站需要学哪些动态网站设计毕业论文
  • 做厨具公司网站seo深圳优化
  • 大兴网站开发网站建设咨询地推拉新app推广平台
  • 广告网站怎么建设排名怎么优化快
  • 自助网站建设网络广告怎么做
  • flash做游戏下载网站营销与销售的区别
  • 适配网站建设模版郑州免费做网站
  • 做男鞋的网站好seo关键词优化软件怎么样
  • 教做3d的网站北京seo关键词
  • 朝阳网站建设 国展关键词推广优化
  • 商务公司网站建设最好用的搜索神器
  • 山东青岛网站建设交换链接网站
  • 开发网站需要哪些技术临沂网站建设公司哪家好
  • 东莞营销型网站滕州百度推广
  • 潍坊 网站建设沈阳关键词优化费用
  • wordpress模板推荐免费网站做seo
  • 浅谈幼儿园网站的建设与管理西安百度关键词排名服务
  • 怎么建设手机网站搜索推广渠道
  • 软考5个高级中哪个好考东莞seo优化排名
  • wordpress 媒体库优化优化排名推广教程网站
  • 做公关用的网站网络广告名词解释
  • 网站代理如何做推广app软件
  • 大型网站建设平台企业宣传推广