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