最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust實(shí)現(xiàn)grep命令行工具的方法

 更新時(shí)間:2022年07月26日 14:22:11   作者:歸海十八刀  
這篇文章主要介紹了Rust實(shí)現(xiàn)grep命令行工具的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、功能:

1、輸入要查詢的字符串文件名,輸出所有匹配的行的內(nèi)容

2、如果設(shè)置環(huán)境變量IGNORE_CASE,則grep匹配將忽略大小寫

3、可使用 > 符號來重定向標(biāo)準(zhǔn)輸出到指定文件中

二、介紹

2.1 使用到的知識:

  • 讀取命令行參數(shù)
  • 讀取文件內(nèi)容
  • 錯(cuò)誤處理
  • Test Driven Development(TDD)
  • 使用環(huán)境變量控制不同行為

2.2 代碼

1、main.rs

use std::env;
use std::process;
use minigrep::Config;
fn main() {
    // let args: Vec<String> = env::args().collect();
    // let query = &args[1];
    // let filename = &args[2];

    // let content = fs::read_to_string(filename).expect("You have a problem in read a file");
    // println!("Filename: {}", filename);
    // println!("File content:\n{}", content);

    //refactoring after
    let args: Vec<String> = env::args().collect();
    // let config = Config::new(&args);
    let config = Config::new(&args).unwrap_or_else(|err| {
        eprintln!("Problem parse arguments: {}", err);
        process::exit(1);
    });
    println!("query: {}, filename: {}", config.query, config.filename);
    
    if let Err(e) = minigrep::run(config) {
        eprintln!("Application Error: {}", e);
        process::exit(1);
    }
}

2、lib.rs

use std::error::Error;
use std::fs;
use std::env;
pub struct Config {
    pub query: String,
    pub filename: String,
    pub ignore_case: bool,
}
impl Config {
    // fn new(args: &[String]) -> Config {
    //     let query = args[1].clone();
    //     let filename = args[2].clone();
    //     Config {query, filename}
    // }
    pub fn new(args: &[String]) -> Result<Config, &'static str> {
        if args.len() < 3 {
            return Err("No enough arguments");
        }
        let query = args[1].clone();
        let filename = args[2].clone();
        let ignore_case = env::var("IGNORE_CASE").is_ok();
        Ok(Config{query, filename, ignore_case})
    }
}
pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    let content = fs::read_to_string(config.filename)?;
    // println!("With text:\n{}", content);
    let result = if config.ignore_case {
        search_case_insensitive(&config.query, &content)
    } else {
        search(&config.query, &content)
    };
        for line in result {
            println!("{}", line);
    }
    Ok(())
}

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

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

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn one_result() {
        let query = "xwp";
        let content = "\
Hello,rust!
xwp is handsome
You know!";
        assert_eq!(vec!["xwp is handsome"], search(query, content));
    }

    #[test]
    fn case_insensitive() {
        let query = "xWp";
        let content = "\
Hello,rust!
xwp is handsome
You KonW";
        assert_eq!(vec!["xwp is handsome"], search_case_insensitive(query, content));
    }
}

三、使用

  • 需要輸入兩個(gè)參數(shù),第一個(gè)是query,第二個(gè)是filename,如果參數(shù)少于兩個(gè)會報(bào)錯(cuò)。
  • 如:cargo run xwp xwphs.txt,xwp是要查詢的內(nèi)容,xwphs.txt是文件。
  • minigrep默認(rèn)是大小寫敏感的,可通過設(shè)置IGNORE_CASE環(huán)境變量,使得查詢忽略大小寫。

在powershell中設(shè)置臨時(shí)環(huán)境變量如:$Env:IGNORE_CASE=1,解除:Remove-Item Env:IGNORE_CASE;在shell中直接:將IGNORE_CASE=1放在最開始

參數(shù)不足時(shí),提示Problem parse arguments: No enough argumentss

在這里插入圖片描述

設(shè)置環(huán)境變量后,不區(qū)分大小寫,查詢到了信息

在這里插入圖片描述

到此這篇關(guān)于Rust實(shí)現(xiàn)grep命令行工具的文章就介紹到這了,更多相關(guān)Rust命令行工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust?Postgres實(shí)例代碼

    Rust?Postgres實(shí)例代碼

    Rust Postgres是一個(gè)純Rust實(shí)現(xiàn)的PostgreSQL客戶端庫,本文主要介紹了Rust?Postgres實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • rust中async/await的使用示例詳解

    rust中async/await的使用示例詳解

    在Rust中,async/await用于編寫異步代碼,使得異步操作更易于理解和編寫,通過使用await,在async函數(shù)或代碼塊中等待Future完成,而不會阻塞線程,允許同時(shí)執(zhí)行其他Future,這種機(jī)制簡化了異步編程的復(fù)雜性,使代碼更加直觀
    2024-10-10
  • 從零開始使用Rust編寫nginx(TLS證書快過期了)

    從零開始使用Rust編寫nginx(TLS證書快過期了)

    wmproxy已用Rust實(shí)現(xiàn)http/https代理,?socks5代理,?反向代理,?負(fù)載均衡,?靜態(tài)文件服務(wù)器,websocket代理,四層TCP/UDP轉(zhuǎn)發(fā),內(nèi)網(wǎng)穿透等,本文給大家介紹從零開始使用Rust編寫nginx(TLS證書快過期了),感興趣的朋友一起看看吧
    2024-03-03
  • Rust控制流運(yùn)算符match的用法詳解

    Rust控制流運(yùn)算符match的用法詳解

    match 是Rust中一個(gè)極為強(qiáng)大的控制流運(yùn)算符,用于模式匹配和控制流的選擇,它允許將一個(gè)值與一系列的模式相比較,根據(jù)匹配的模式執(zhí)行相應(yīng)代碼,本文給大家詳細(xì)介紹了Rust控制流運(yùn)算符match的用法,需要的朋友可以參考下
    2024-01-01
  • Rust中的引用與借用舉例詳解

    Rust中的引用與借用舉例詳解

    這篇文章主要給大家介紹了關(guān)于Rust中引用與借用的相關(guān)資料,rust中借用和引用的附帶功效都一樣,就是都有生命周期,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Rust具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • rust 一個(gè)日志緩存記錄的通用實(shí)現(xiàn)方法

    rust 一個(gè)日志緩存記錄的通用實(shí)現(xiàn)方法

    本文給出了一個(gè)通用的設(shè)計(jì)模式,通過建造者模式實(shí)例化記錄對象,可自定義格式化器將實(shí)例化后的記錄對象寫入到指定的緩存對象中,這篇文章主要介紹了rust 一個(gè)日志緩存記錄的通用實(shí)現(xiàn)方法,需要的朋友可以參考下
    2024-04-04
  • Rust中字符串類型&str和String的使用

    Rust中字符串類型&str和String的使用

    在Rust中,字符串是一種非常重要的數(shù)據(jù)類型,&str和String是Rust中兩種主要的字符串類型,本文主要介紹了Rust中字符串類型&str和String的使用,感興趣的可以了解一下
    2024-03-03
  • 深入了解Rust的生命周期

    深入了解Rust的生命周期

    生命周期指的是引用保持有效的作用域,Rust的每個(gè)引用都有自己的生命周期。本文將通過示例和大家詳細(xì)說說Rust的生命周期,需要的可以參考一下
    2022-12-12
  • 淺談Rust中聲明可見性

    淺談Rust中聲明可見性

    在Rust編程語言中,聲明可見性是一個(gè)核心概念,本文主要介紹了Rust中聲明可見性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 深入了解Rust的生命周期

    深入了解Rust的生命周期

    生命周期指的是引用保持有效的作用域,Rust?的每個(gè)引用都有自己的生命周期。本文將通過示例和大家詳細(xì)說說Rust的生命周期,需要的可以參考一下
    2022-11-11

最新評論

察雅县| 榆中县| 昆明市| 和平区| 泾源县| 佛山市| 延边| 固安县| 同仁县| 克山县| 临海市| 德惠市| 浦东新区| 双桥区| 原阳县| 双牌县| 德惠市| 汝南县| 敖汉旗| 山西省| 大安市| 灵川县| 宁南县| 和平县| 和平县| 永平县| 绥滨县| 井研县| 定边县| 枞阳县| 祥云县| 石家庄市| 海盐县| 漳浦县| 平邑县| 永清县| 开原市| 庆安县| 保德县| 巩义市| 喀喇沁旗|