Skip to content
TwitterQiitaGitHub

Rust の静的変数

参考資料

  • conststatic

  • Rustのstaticいろいろ - 簡潔なQ

  • Rustのstatic変数とthread local - Qiita

  • lazy_static はもう古い!? once_cell を使おう

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));
    }