列挙型とmatch
enumは、取りうる状態を名前付きで表します。matchで全ての状態を分岐すると、処理漏れをコンパイラーが見つけてくれます。
状態を分岐するRUST
enum Payment { Cash, Card(u32) }
fn main() {
for payment in [Payment::Cash, Payment::Card(1200)] {
match payment {
Payment::Cash => println!("現金払い"),
Payment::Card(amount) => println!("カード払い: {amount}円"),
}
}
}実行結果OUTPUT
現金払い
カード払い: 1200円Vecで値を並べる
Vec<T>は同じ型の値を可変長で保存します。pushで追加し、反復処理では範囲外アクセスを避けるため参照やgetも使います。
ベクターを使うRUST
fn main() {
let mut scores = vec![70, 85];
scores.push(92);
for score in &scores { println!("{score}"); }
}実行結果OUTPUT
70
85
92HashMapで対応関係を保存する
HashMapはキーと値の組を保存します。単語の出現回数を数えるような処理に向いています。
単語を数えるRUST
use std::collections::HashMap;
fn main() {
let mut counts = HashMap::new();
for word in "rust rust code".split_whitespace() {
*counts.entry(word).or_insert(0) += 1;
}
println!("rust: {}", counts["rust"]);
}実行結果OUTPUT
rust: 2計算と添字アクセスの注意
整数同士の割り算は小数を切り捨てます。また、ベクターを添字で範囲外アクセスするとパニックになるため、存在しない可能性がある場合はgetでOptionを受け取ります。
整数除算と安全なアクセスRUST
fn main() {
let values = vec![10, 20, 30];
println!("{}", 10 / 3);
println!("{:?}", values.get(5));
}実行結果OUTPUT
3
None安全に確認する
10 / 3は3になります。添字アクセスが安全とは限らないことも覚えておきましょう。練習
文章を単語に分け、HashMapで各単語の出現回数を数えてみましょう。