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