③変数を格納

このコード部分の話

critical_section::with(|cs| {
    GLOBAL_PINS
        .borrow(cs)
        .replace(Some((green_led, red_led, orange_led, button, timer)));
});

critical_setcion::with

critical_setcion::withは、critical_section::MutexであるGLOBAL_PINSの変数の操作をするための関数です。 この|cs|{...}の中のやり取りは、他のスレッドからブロックできます。 一連のLEDとButtonのpinの設定がされた、green_ledred_ledorange_ledbuttontimerを格納しています。

またcsは、Critical Sectionの略です。変数のためcsでないaaでも動作します。

クロージャ(|cs|{})

|cs|{}は、関数を引数として渡せるクロージャと言われるもので、csが関数の引数の役割を果たします。

他の言語では、関数を別で宣言して::with(function_name)のようにして関数名を書いて渡したりしますが、このクロージャを利用することでfunction_nameが不要になり、1つ関数名を考えなくて良くなります。

今回のような小規模なプログラムではメリットを感じないですが、大規模なプログラムになると全体の設計を把握して関数名を決定する必要があるため、1つ考える関数名が減るのはありがたいものです。

borrow

所有権限を借用することを示しています。 Rustでは、所有権を持つことで変数の値の変更することができるので、この操作が必要になります。

replace

値を置き換えることを意味しています。 ここでは、NoneからSome((green_led, red_led, orange_led, button, timer))に置き換えています。

Some

GLOBAL_PINSは、Optionの変数でした。Optionにした理由は、Noneを利用したかったためです。Someは、Optionで設定した変数に格納する際、宣言するものです。

逆に次のコードでは変数に格納数ことはできません。

   .replace((green_led, red_led, orange_led, button, timer));