Rust の静的変数
参考資料
const と static の違い
const
はコンパイル時に決まる値そのものを定義する。- この値はコンパイル時定数が必要な他の場所で使える。
- コンパイル時に決まる値そのものを定義したい場合はこっちを使う。
static
は(コンパイル時に決まる値が入っている)場所を定義する。- 値がコンパイル時に決まるのは初期化の都合上にすぎず、それ以上の意味はない。
- 状態を管理する場所を作りたい場合はこっちを使う。
不変(イミュータブル)なグローバルデータを once_cell
で実現
-
crate のドキュメントとか
-
用意にグローバル変数を使うクレートとして
lazy_static
がデファクトスタンダードになっていたが、マクロを使うため、ちょっとわかりにくい。。。ということで同様の処理をマクロ無しで実現したのがonce_cell
-
Cargo.toml
に記述する内容は以下:[dependencies]once_cell = "1.5.2" -
main.rs
にグローバル変数を定義する:#[macro_use]use once_cell::sync::Lazy;mod app_context {use std::collections::HashMap;static MAP: Lazy<HashMap<u32, &'static str>> = Lazy::new(|| {let mut m = HashMap::new();m.insert(0, "foo");m});}const NF: &'static str = "not found";fn main() {read_app_map();println!("Done");}fn read_app_map() {let ref m = app_context::MAP;assert_eq!("foo", *m.get(&0).unwrap_or(&NF));assert_eq!(NF, *m.get(&1).unwrap_or(&NF));}