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編程發揚光大,其實是生生割裂了異步編程生態的健康發展。

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