Rust - 常用的三方库集合

一、once_cell

是一种只执行一次的容器,多用于全局变量安全初始化,或者延迟初始化

  • set(T) => 安全的设置全局变量
  • get() -> T => 获取已经设置的全局变量
  • get_or_init(Fn) => 获取全局变量,为空则初始化
  • Lazy::new(Fn) => 延迟创建全局变量
use std::{sync::Mutex, collections::HashMap};
use once_cell::sync::Lazy;
use once_cell::sync::OnceCell;

static GLOBAL_DATA: Lazy<Mutex<HashMap<i32, String>>> = Lazy::new(|| {
    let mut m = HashMap::new();
    m.insert(13, "Spica".to_string());
    m.insert(74, "Hoyten".to_string());
    Mutex::new(m)
});

fn global_data() -> &'static Mutex<HashMap<i32, String>> {
    static INSTANCE: OnceCell<Mutex<HashMap<i32, String>>> = OnceCell::new();
    INSTANCE.get_or_init(|| {
        let mut m = HashMap::new();
        m.insert(13, "Spica".to_string());
        m.insert(74, "Hoyten".to_string());
        Mutex::new(m)
    })
}
二、lazy_static

是一种执行一次的宏,多用于初始化全局变量,功能相对单一

#[macro_use]
extern crate lazy_static;

use std::collections::HashMap;

lazy_static! {
    static ref HASHMAP: HashMap<u32, &'static str> = {
        let mut m = HashMap::new();
        m.insert(0, "foo");
        m.insert(1, "bar");
        m.insert(2, "baz");
        m
    };
    static ref COUNT: usize = HASHMAP.len();
    static ref NUMBER: u32 = times_two(21);
}

fn times_two(n: u32) -> u32 { n * 2 }

fn main() {
    println!("The map has {} entries.", *COUNT);
    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
    println!("A expensive calculation on a static results in: {}.", *NUMBER);
}
三、serde、serde_json、serde_yaml、serde_urlencoded、toml-rs

是一个关于序列化和反序列化的三方库,常用于配置文件解析,或http返回json

[dependencies]
serde = { version = "1.0.105", features=["derive"] }
serde_json = "1.0.50"
serde_yaml = "0.8.11"
serde_urlencoded = "0.6.1"
toml = "0.5.6"
chrono = { version = "0.4.11", features=["serde"]}

#[macro_use]
extern crate serde;

use chrono::NaiveDateTime;
use serde_json;

#[derive(Debug, Serialize, Deserialize)]
struct User {
    name: String,
    age: u32,
    #[serde(rename="sex")]
    gender: u32,
    birthday: NaiveDateTime,
}

fn main() {
    let str = r#"{"name": "jack", "age": 20, "sex": 1, "birthday": "2020-01-01T15:14:15"}"#;
    let v: User = serde_json::from_str(str).unwrap();
    println!("{:?}", v) // User { name: "jack", age: 20, gender: 1, birthday: 2020-01-01T15:14:15 }
}
四、hyper、reqwest

一个基于tokio的网络库

    let client = Client::new();

    let mut res = client.get(url).await?;

    println!("Response: {}", res.status());
    println!("Headers: {:#?}\n", res.headers());

    // Stream the body, writing each chunk to stdout as we get it
    // (instead of buffering and printing at the end).
    while let Some(next) = res.data().await {
        let chunk = next?;
        io::stdout().write_all(&chunk).await?;
    }

    println!("\n\nDone!");
let body = reqwest::get("https://www.rust-lang.org")
    .await?
    .text()
    .await?;

println!("body = {:?}", body);
五、clap、dotenv、app_dirs、preferences

命令行相关的工具库,非常强大

六、tokio、async-std

两套类似的异步编程runtime实现库,虽然async-std强词夺理说这是让async编程发扬光大,其实是生生割裂了异步编程生态的健康发展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章