③変数を格納
このコード部分の話
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_led
、red_led
、orange_led
、button
、timer
を格納しています。
また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));