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

如何基于Rust實(shí)現(xiàn)文本搜索minigrep

 更新時(shí)間:2024年08月09日 11:44:02   作者:yoho-zhang  
這篇文章主要介紹了基于Rust實(shí)現(xiàn)的文本搜索minigrep,本次演示介紹針對(duì)原作者代碼程序的查詢邏輯做了一點(diǎn)點(diǎn)小的優(yōu)化,原程序邏輯的查詢是放在了程序運(yùn)行的時(shí)候,邏輯修改后啟動(dòng)的時(shí)候可以添加參數(shù),也可以啟動(dòng)后添加,需要的朋友可以參考下

在Rust學(xué)習(xí)社區(qū)看到了 用Rust語言實(shí)現(xiàn)的minigrep,對(duì)于初學(xué)者的我來說,這個(gè)項(xiàng)目很感興趣,于是跟著實(shí)現(xiàn)了一遍,并完善了一點(diǎn)邏輯,以下是對(duì)項(xiàng)目的介紹

效果展示

本次演示介紹針對(duì)原作者代碼程序的查詢邏輯做了一點(diǎn)點(diǎn)小的優(yōu)化,原程序邏輯的查詢是放在了程序運(yùn)行的時(shí)候,邏輯修改后啟動(dòng)的時(shí)候可以添加參數(shù),也可以啟動(dòng)后添加,具體如下
修改前

查詢時(shí) 需要輸入查詢的字符串和文件
cargo run -- th poem.txt

修改后

啟動(dòng)程序:cargo run輸入要查詢的字符串 th輸入要查詢的文件路徑 poem.txt查詢到的結(jié)果:
Then there’s a pair of us - don’t tell!
They’d banish us, you know.
To tell your name the livelong day退出程序:輸入:q

如下圖所示

代碼實(shí)現(xiàn)

代碼結(jié)構(gòu)

minigrep
├── Cargo.lock
├── Cargo.toml
├── output.txt
├── poem.txt
├── src
    ├── lib.rs
    └── main.rs

代碼展示

/src/main.rs

use std::{env, process};
use std::io::stdin;
use minigrep::Config;
fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() == 1 {
        // 如果沒輸入查詢參數(shù),就循環(huán)等待用戶的輸入
        loop {
            println!("請(qǐng)輸入要查詢的字符串:");
            // 等待用戶輸入
            let mut input = String::new();
            stdin().read_line(&mut input).expect("無法讀取");
            let mut args = input.split_whitespace();
            let mut a = String::new();
            let query = args.next().unwrap_or_else(|| {
                println!("請(qǐng)輸入有效的查詢字符串");
                stdin().read_line(&mut a);
                &a.as_str().trim()
            });
            if(":q".eq(query.clone())){
                println!("程序退出");
                process::exit(1);
            }
            let mut a = String::new();
            let file_path = args.next().unwrap_or_else(|| {
                println!("請(qǐng)輸入文件路徑:");
                stdin().read_line(&mut a);
                &a.as_str().trim()
            });
            let config1 = Config { query: query.to_string(), file_path: file_path.to_string(), ignore_case: true };
            if let Err(e) = minigrep::run(config1) {
                eprintln!("程序出錯(cuò):{e}");
            }
        }
    } else {
        // 啟動(dòng)時(shí)的入?yún)?
        let config = Config::build(env::args()).unwrap_or_else(|err| {
            eprintln!("程序解析 參數(shù)異常 {err}");
            process::exit(1);
        });
        println!("search for {}", config.query);
        println!("in file {}", config.file_path);
        if let Err(e) = minigrep::run(config) {
            eprintln!("程序出錯(cuò):{e}");
            process::exit(1);
        }
    }
}

/src/lib.rs

use std::error::Error;
use std::{env, fs};
// 查詢業(yè)務(wù)邏輯
pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    if let Ok(contents) = fs::read_to_string(config.file_path){
        let lines = if config.ignore_case {
            search_case_insensitive(&config.query, &contents)
        } else {
            search(&config.query, &contents)
        };
        println!("查詢到的結(jié)果:");
        for line in lines {
            println!("{line}")
        }
        Ok(())
    }else {
        Err(Box::from("未查詢到文件"))
    }
}
// 配置實(shí)體
pub struct Config {
    pub query: String,
    pub file_path: String,
    pub ignore_case:bool,
}
impl Config {
    // 構(gòu)建配置實(shí)體
    pub fn build(mut args: impl Iterator<Item =String>) -> Result<Config, &'static str> {
        let _programeName = args.next();
        let query = match args.next() {
            Some(query) => query,
            None => return Err("未獲取到 要查詢的 字符串參數(shù)"),
        };
        let file_path = match args.next() {
            Some(file_path) => file_path,
            None => return Err("未獲取到文件路徑"),
        };
        // 從環(huán)境變量中找到是否包含 IGNORE_CASE
        let ignore_case =  env::var("IGNORE_CASE").is_ok();
        Ok(Config { query, file_path ,ignore_case})
    }
}
// 對(duì)參數(shù)解析
fn parse_config(args: &[String]) -> Config {
    let query = args[1].clone();
    let file_path = args[2].clone();
    let ignore_case =  env::var("IGNORE_CASE").is_ok();
    Config { query, file_path ,ignore_case}
}
// 大小寫敏感查詢
pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    contents
        .lines()
        .filter(|line| line.contains(query))
        .collect()
}
// 忽略大小寫查詢
pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    contents
        .lines()
        .filter(|line| line.to_lowercase().contains(&query.to_lowercase()))
        .collect()
}
// 測試模塊
#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn one_result() {
        let query = "duct";
        let contents = "\
Rust:
safe, fast, productive.
Pick three.";
        assert_eq!(vec!["safe, fast, productive."], search(query, contents))
    }
    #[test]
    fn test_case_insensitive() {
        let query = "RusT";
        let contents = "\
Rust:
safe, fast, productive.
Pick three.";
        assert_eq!(vec!["Rust:"], search_case_insensitive(query, contents))
    }
}

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

相關(guān)文章

  • Rust Struct結(jié)構(gòu)體詳解

    Rust Struct結(jié)構(gòu)體詳解

    結(jié)構(gòu)體,是一種自定義數(shù)據(jù)類型,允許程序員將不同類型的數(shù)據(jù)結(jié)合起來,形成相關(guān)聯(lián)的整體。Rust的結(jié)構(gòu)體還提供方法和關(guān)聯(lián)函數(shù),可以指定那些與結(jié)構(gòu)體數(shù)據(jù)相關(guān)的行為
    2022-10-10
  • 使用Rust語言編寫一個(gè)ChatGPT桌面應(yīng)用示例詳解

    使用Rust語言編寫一個(gè)ChatGPT桌面應(yīng)用示例詳解

    這篇文章主要介紹了如何用Rust編寫一個(gè)ChatGPT桌面應(yīng)用,文中有詳細(xì)的流程介紹,對(duì)大家的學(xué)習(xí)或工作有意一定的幫助,需要的朋友可以參考下
    2023-05-05
  • 如何使用Rust寫個(gè)猜數(shù)字游戲

    如何使用Rust寫個(gè)猜數(shù)字游戲

    這篇文章主要介紹了Rust寫個(gè)猜數(shù)字游戲,本項(xiàng)目通過動(dòng)手實(shí)踐,介紹了Rust新概念:let、match、函數(shù)、使用外部 crate 等,接下來的文章,你會(huì)繼續(xù)深入學(xué)習(xí)這些概念,并且介紹大部分編程語言都有的概念,如變量、數(shù)據(jù)類型和函數(shù),以及如何在 Rust 中使用它們,需要的朋友可以參考下
    2023-12-12
  • 詳解Rust調(diào)用tree-sitter支持自定義語言解析

    詳解Rust調(diào)用tree-sitter支持自定義語言解析

    使用Rust語言結(jié)合tree-sitter庫解析自定義語言需要定義語法、生成C解析器,并在Rust項(xiàng)目中集成,具體步驟包括創(chuàng)建grammar.js定義語法,使用tree-sitter-cli工具生成C解析器,以及在Rust項(xiàng)目中編寫代碼調(diào)用解析器,這一過程涉及到對(duì)tree-sitter的深入理解和Rust語言的應(yīng)用技巧
    2024-09-09
  • Rust for循環(huán)語法糖背后的API場景分析

    Rust for循環(huán)語法糖背后的API場景分析

    for語句是一種能確定循環(huán)次數(shù)的循環(huán),for 語句用于執(zhí)行代碼塊指定的次數(shù),今天通過本文給大家介紹Rust for循環(huán)語法糖背后的API場景分析,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • rust中間件actix_web在項(xiàng)目中的使用實(shí)戰(zhàn)

    rust中間件actix_web在項(xiàng)目中的使用實(shí)戰(zhàn)

    這篇文章主要介紹了rust中間件在項(xiàng)目中的使用實(shí)戰(zhàn),包括自定義中間件,日志中間件,Default?headers,用戶會(huì)話,錯(cuò)誤處理的用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Rust常用功能實(shí)例代碼匯總

    Rust常用功能實(shí)例代碼匯總

    通過一系列實(shí)用示例展示了Rust在文件操作、網(wǎng)絡(luò)請(qǐng)求、并發(fā)編程、命令行工具以及數(shù)據(jù)庫操作等方面的應(yīng)用,這些示例不僅展示了 Rust 的強(qiáng)大功能,還提供了實(shí)際開發(fā)中的指導(dǎo)和參考,通過這些示例,您可以更好地理解 Rust 的特性,并將其應(yīng)用于您的項(xiàng)目中
    2024-12-12
  • Rust讀取配置文件的實(shí)現(xiàn)

    Rust讀取配置文件的實(shí)現(xiàn)

    本文主要介紹了Rust讀取配置文件的實(shí)現(xiàn),主要讀取Cargo.toml文件,讀取.env文件和讀取自定義toml文件這三種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Rust中的Cargo構(gòu)建、運(yùn)行、調(diào)試

    Rust中的Cargo構(gòu)建、運(yùn)行、調(diào)試

    Cargo是rustup安裝后自帶的,Cargo?是?Rust?的構(gòu)建系統(tǒng)和包管理器,這篇文章主要介紹了Rust之Cargo構(gòu)建、運(yùn)行、調(diào)試,需要的朋友可以參考下
    2022-09-09
  • Rust 中的 Tokio 線程同步機(jī)制詳解

    Rust 中的 Tokio 線程同步機(jī)制詳解

    Rust中的Tokio提供了多種線程同步機(jī)制,包括互斥鎖、讀寫鎖、屏障、信號(hào)量、通知及消息通道,用于協(xié)調(diào)并發(fā)訪問、資源共享和狀態(tài)同步,提升程序的安全性和效率,本文給大家介紹Rust中的Tokio線程同步機(jī)制,感興趣的朋友一起看看吧
    2025-09-09

最新評(píng)論

伽师县| 扎囊县| 麻城市| 高州市| 垣曲县| 甘孜| 静海县| 福海县| 民勤县| 什邡市| 西昌市| 周宁县| 铜山县| 监利县| 遂平县| 抚宁县| 四川省| 武邑县| 马山县| 赣榆县| 河北区| 开鲁县| 南丰县| 昌宁县| 景谷| 宁海县| 宣汉县| 黄梅县| 正定县| 阳新县| 搜索| 临安市| 勐海县| 九龙城区| 江北区| 伊金霍洛旗| 赣榆县| 武鸣县| 太湖县| 格尔木市| 彰化市|