いつもと違う雰囲気を感じている柴犬です。
連日、RUSTに悪戦苦闘しています。
概略
列挙型Result<T, E>は列挙子 Ok(T)、Err(E) を持ち、そしてOption<T>はSome(T)、None を持ちます。
この2つの例のように、RUSTの列挙型は列挙子に値を紐付けることが基本のため、列挙型の理解が必要不可欠となります。
そこで、理解を深めようといろいろ試してみました。
試してみたコード
use crate::Message::*; を使用して Message:: を付けずに済ませていますのでスッキリと見えます。
use crate::Message::*; #[allow(dead_code)] #[derive(Debug)] enum Message { Quit, Temperature(i32), Move {x: i32, y: i32}, Write(String), ChangeColor(i32, i32, i32), } fn main() { //let mut mes = Quit; //let mut mes = Temperature(25); //let mut mes = Move{x: 1, y: 2}; //let mut mes = Write(String::from("test")); //let mut mes = ChangeColor(155, 255, 355); println!("{:?}", mes); match mes { Quit => println!("Quit"), // Guardsを試してみます。 Temperature(v) if v > 30 => println!("Today is hot {}", v), // Bindingを試してみます。 Temperature(v @ 20 ..= 30) => println!("Today is mild {}", v), Temperature(v) => println!("Today is cool {}", v), Move{x, y} => println!("x = {} y = {}", x, y), // 列挙子の値を変更します。 Write(s) => {mes = Write(s + "2");}, // Guardsを試してみます。 ChangeColor(a, b, c) if a==0 || b==0 ||c==0 => println!("Zero"), ChangeColor(a, b, c) => println!("a = {} b = {} c = {}", a, b, c), } println!("{:?}", mes); }
Temperature
上記のコードを次のように変更して順次実行してみます。
//let mut mes = Temperature(25);
↓
let mut mes = Temperature(25);
↓
let mut mes = Temperature(35);
↓
let mut mes = Temperature(15);
実行した結果です。
Move
コメントを外しただけです。
//let mut mes = Move{x: 1, y: 2};
↓
let mut mes = Move{x: 1, y: 2};
実行した結果です。
Write
これも、コメントを外しただけです。
列挙子の値を変えることができるかどうか確かめるために書きました。ミュータブル mut を付加すればいいようです。
//let mut mes = Write(String::from("test"));
↓
let mut mes = Write(String::from("test"));
実行した結果です。
ChangeColor
上記のコードを次のように変更して順次実行してみます。
//let mut mes = ChangeColor(155, 255, 355);
↓
let mut mes = ChangeColor(155, 255, 355);
↓
let mut mes = ChangeColor(0, 255, 355);
実行した結果です。
まとめ
RUSTは、列挙型、matchの熟練が必須なようです。