定数と変数

先の不変な変数ですが、お気づきでしょうか。 不変なら変数と名乗るべきでないのではないか!と。 そもそもここまでの説明だけだと、不変な変数の存在意義は定数と同じです。 では、不変な変数は定数なのか?まず定数についてまとめます。

定数は以下のように定義されます。

#![allow(unused)]
fn main() {
const MAX_VALUE: u32 = 10;
println!("最大値は{}", MAX)
}

定数はconstで宣言し、値の型も必ず指定する必要があります。 型については、以降のセクションで紹介しますので、 今は値がどんな値かを記す必要があると思ってください。 この場合だと、u32は32ビットの符号なし整数です。

Rustの命名規則では全て大文字で_で単語を区切るそうです。

変数と定数(constants)の違い

では、変数と定数の違いは何でしょうか。 まず定数は、グローバルスコープでも定義できます。 スコープとは、ある変数や関数、定数などを参照できる範囲のことです。 具体的な例を以下に示します。

~~~

// ④定数
const XTAL_FREQ_HZ: u32 = 12_000_000u32;

// ⑤main関数
#[rp2040_hal::entry]
fn main() -> ! {
    // ⑥プログラム開始ログ
    info!("Program start!");

    // ⑦各設定のintit
    let mut pac = pac::Peripherals::take().unwrap();

    let clocks = hal::clocks::init_clocks_and_plls(
        XTAL_FREQ_HZ,
        pac.XOSC,
        pac.CLOCKS,
        pac.PLL_SYS,
        pac.PLL_USB,
        &mut pac.RESETS,
        &mut watchdog,
~~~
このコードは本稿6章で取り扱うLチカ用のコードです。かなり簡略化しているので動作はしません。
このコードで実行されるメイン関数(`fn main()`)の外部(グローバルスコープ)で`XTAL_FREQ_HZ`が宣言されています。 この`XTAL_FREQ_HZ`をメイン関数内の`let clocks`で参照していることが確認できます。 `XTAL_FREQ_HZ`はマイコン外部の水晶発信子の周波数です。 グローバルスコープの概念は難しいですが、周波数のように不変で複数の関数などで利用される可能性がある値があるならば、 関数外にいろいろなところから使える値として定数を宣言することは有用ですね。