#7 Rustで学ぶ配列の基本
Rustには、複数の値をまとめて扱うためのデータ構造として、「配列」と「ベクター」という2種類の似た仕組みがあります。この記事では、それぞれの違いと基本的な使い方を解説します。
配列(固定長)
Rustの配列は、作成時に大きさが決まっていて、後から変更できません。
let fruits: [&str; 3] = ["りんご", "みかん", "ぶどう"];
要素の数まで型の一部として決まっているのが、Rustらしい厳格さです。
ベクター(可変長)
大きさを自由に変えたい場合は、Vecという「ベクター」を使います。
let mut fruits: Vec<&str> = vec!["りんご", "みかん", "ぶどう"];
fruits.push("メロン");
実際のプログラムでは、こちらのベクターを使う場面が多くなります。値を削除するにはfruits.remove(0)のように添字を指定します。
要素にアクセスする・繰り返す
配列・ベクターどちらも、0から始まる添字でアクセスします。
println!("{}", fruits[0]);
for fruit in &fruits {
println!("{}", fruit);
}
ただし、存在しない添字を指定すると、Rustはその場でプログラムを停止させます。これは、範囲外の場所を読み取ってしまう危険なバグを防ぐための仕組みです。
安全にアクセスするget()
プログラムを停止させたくない場合は、get()を使うとOption型として安全にアクセスできます。
match fruits.get(10) {
Some(fruit) => println!("{}", fruit),
None => println!("存在しない添字です"),
}
ベクターを加工する
すべての要素に処理をしたい場合はiter().map()、条件に合う要素だけ残したい場合はiter().filter()が使えます。
let upper: Vec<String> = fruits.iter().map(|f| f.to_uppercase()).collect();
最後のcollect()を忘れると、実際のベクターとして使えない点に注意しましょう。
Rustならではの注意点
「配列は固定長」「ベクターは可変長」という違いを理解しておくことが、Rustで最初につまずかないための重要なポイントです。値を追加したり削除したりする可能性があるなら、最初からベクターを選んでおくと安心です。範囲外アクセスでプログラムが停止する挙動も、バグを未然に防ぐRustらしい安全設計だと理解しておきましょう。
まとめ
Rustには固定長の「配列」と可変長の「ベクター」があり、実用上はベクターを使う場面が多くなります。get()による安全なアクセスや、map・filterによる加工も含め、用途に応じて使い分けましょう。
本ページはプロモーションを含みます。
参考書籍(PR)
Rustをもっと学びたい方には「実践Rust入門[言語仕様から開発手法まで]」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿