• Rust生态技术栈


    开发整理,常用技术栈。

    1.日志记录

    依赖

    [dependencies]
    log = "0.4.14"
    simple_logger = "2.1.0"
    time = "0.3.7"
    
    • 1
    • 2
    • 3
    • 4

    初始化

    use log::LevelFilter;
    use simple_logger::SimpleLogger;
    use time::UtcOffset;
    
    pub fn init_log() {
        SimpleLogger::new()
            .with_level(LevelFilter::Info)
            .with_colors(true)
            .with_utc_offset(UtcOffset::from_hms(8, 0, 0).unwrap())
            .init()
            .unwrap();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.输入/输出

    特别注意:从控制台输入,会隐含读入\n换行符等,需要进行trim处理,否则使用match等方法匹配失败。

    // 标准输出
    println
    // 标准错误
    eprintln
    
    // 输入
    let mut input = String::new();
    std::io::stdin()
    .read_line(&mut input)
    .expect("输入错误!");
    // 输出
    println!("你输入的内容是 : {}", input);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.String类型的match

    let user_choice = menu_handle();
    
    // 通过String.as_str()方法可快速转换,此处为处理换行符,调用trim方法,trim方法隐含有转&str的能力
    match user_choice.trim() {
        "1" => println!("用户选择1"),
        "2" => println!("用户选择2"),
        _ => println!("用户选择功能项无效"),
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.print!()输出无效问题

    print!("输入文件名:");
    
    • 1

    解析:rust标准输出是行缓冲的,只有到了行尾才显示,想要输出需要手动刷新。

    io::stdout().flush();
    
    • 1

    5.线程

    use std::thread::sleep;
    
    // 线程睡眠
    sleep(Duration::from_secs(1));
    
    • 1
    • 2
    • 3
    • 4

    6.Excel读取

    calamine = "0.18.0"
    
    • 1
    // calamine = "0.18.0"
    fn data_read(file_path: String) {
        //Excel读取
        let mut excel: Xlsx<_> = open_workbook(file_path).expect("打开Excel文件失败!");
        if let Some(Ok(r)) = excel.worksheet_range_at(0) {
            let (h, w) = r.get_size();
            log::info!("读取到Excel文件共{}行, {}列", h, w);
            let mut title_vec: Vec<String> = Vec::new();
            for i in 0..w {
                let title_name = r.get_value((0, i as u32)).unwrap().to_string();
                title_vec.push(title_name);
            }
            println!("titles:{:?}", title_vec);
    
            // 跳过首行标题行
            let rows = r.rows().skip(1);
            for row in rows {
                println!("row[5]={:?}", row[5]);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    7.字符串转整型

    let num = input.trim().parse::<i32>().unwrap();
    
    • 1

    8.终端输出彩色文本

    colored = "2.0.0"
    
    • 1
    "this is blue".blue();
    "this is red".red();
    "this is red on blue".red().on_blue();
    "this is also red on blue".on_blue().red();
    "you can use truecolor values too!".truecolor(0, 255, 136);
    "background truecolor also works :)".on_truecolor(135, 28, 167);
    "bright colors are welcome as well".on_bright_blue().bright_red();
    "you can also make bold comments".bold();
    println!("{} {} {}", "or use".cyan(), "any".italic().yellow(), "string type".cyan());
    "or change advice. This is red".yellow().blue().red();
    "or clear things up. This is default color and style".red().bold().clear();
    "purple and magenta are the same".purple().magenta();
    "and so are normal and clear".normal().clear();
    "you can specify color by string".color("blue").on_color("red");
    String::from("this also works!").green().bold();
    format!("{:30}", "format works as expected. This will be padded".blue());
    format!("{:.3}", "and this will be green but truncated to 3 chars".green());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    9.字符串截取

    //注意:find查出是索引号,中文存储UTF8编码,一个中文占3个字节。
    //总长度
    let len = company.len_utf8();
    let index = company_name.find("区").unwrap();
    let end = min(company_name.len(), index + 3 * 3);
    company_name[index + 3..end].to_string()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    10.tokio线程

    let handle = tokio::spawn(async move {
        sleep(Duration::from_secs(interval_time as u64));
    });
    handle.await.unwrap();
    
    • 1
    • 2
    • 3
    • 4

    11.HTTP客户端

    reqwest = { version = "0.11", features = "blocking"}
    
    • 1
    // reqwest可以使用阻塞方式
    let body = reqwest::blocking::get(url).unwrap().text().unwrap();
    
    • 1
    • 2

    12.html转markdown

    html2md = "0.2"
    
    • 1
    html2md::parse_html(&body);
    
    • 1

    13.命令行解析:clap(官方推荐)

    clap = "3.0.0-beta.4"
    
    • 1

    14.HTTP服务器

    # actix-web
    # rocket
    # warp
    # axum
    
    • 1
    • 2
    • 3
    • 4

    15.客户端框架

    # Web技术栈:tauri
    # 原生 GUI:druid、iced 和 sixtyfps。
    
    • 1
    • 2

    16.Web前端框架

    • Yew:使用 WebAssembly 来创建多线程的前端 web 应用。

    17.集合

    //Vec HashMap都会扩容
    //显式调用shrink_to_fit方法,可缩小容量
    
    • 1
    • 2

    18.金融计算

    # 目前较活跃的库:用纯Rust编写的十进制实现,适合财务计算
    rust_decimal = "1.25.0"
    
    • 1
    • 2

    19.数据库操作

    // Rust 支持几乎所有主流的数据库,包括但不限于 MySQL、Postgres、Redis、RocksDB、Cassandra、MongoDB、ScyllaDB、CouchDB 等等
    // 使用 ORM,可以用: diesel,或者 sea-orm。
    // 如果你享受直接但安全的 SQL 查询,可以使用 sqlx。
    
    • 1
    • 2
    • 3

    20.Web自动化测试

    //Rust 有对标 puppeteer 的 headless_chrome
    //以及对标 selenium 的 thirtyfour 和 fantoccini。
    
    • 1
    • 2

    21.云原生开发

    // 处理 Kubernetes API 的:kube-rs
    
    • 1

    22.WebAssembly 开发

    // 用 wasm-pack 和 wasm-bindgen,不但生成 wasm,同时还生成 ts/js 调用 wasm 的代码
    
    
    • 1
    • 2

    23.html解析

    nipper = "0.1.9"
    tendril = "0.4.2"
    
    • 1
    • 2

    24.正则

    regex = "1.5.6"
    
    • 1
    /// 正则处理内容,多空格自动替换
    pub async fn content_handle(content: &str) -> String {
        let r = Regex::new(r"\s+").unwrap();
        let res = r.replace_all(content, " ");
        res.to_string()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    25.递归调用

    // 引入依赖:async-recursion = "1.0.0"
    // 递归方法增加:#[async_recursion(?Send)]
    
    • 1
    • 2

    26.hash code

    let mut hasher = DefaultHasher::new();
    url.hash(&mut hasher);
    let id = hasher.finish();
    
    • 1
    • 2
    • 3

    27.json

    # serde: required if you are going to use documents
    serde = { version="1.0",   features = ["derive"] }
    # serde_json: required in some parts of this guide
    serde_json = "1.0"
    
    • 1
    • 2
    • 3
    • 4
    #[derive(Serialize, Deserialize)]
    
    • 1
  • 相关阅读:
    51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储&秒表
    WPF MVVM模式下如何给Textbox设置焦点(GalaSoft.MvvmLight)
    433. 最小基因变化
    DevEco Studio 3.0编辑器配置技巧篇
    可视化学习:实现Canvas图片局部放大镜
    连续仨月霸占牛客榜首,京东 T8 呕心沥血神作:700 页 JVM 虚拟机实战手册
    STA学习记录5-时序路径组和外部属性建模
    选型宝发布“2021-2022 中国数字化转型TOP100案例”榜单!
    【Unity,C#】控制方向光模拟昼夜变化的脚本
    使用OkHttp库爬取百度云视频详细步骤
  • 原文地址:https://blog.csdn.net/womeng2009/article/details/125473003