Rust 配列とスライスの使い方と注意点
Rustの配列(array)とスライス(slice)は、データの連続した部分を扱うための基本的なデータ構造です。
配列は固定長で、スライスは可変長ですが、所有権を持たず、他のデータ構造に基づいているのが特徴です。
配列(Array)
配列は固定長であり、同じ型の要素を持ちます。
配列の長さは定義時に指定され、変更することはできません。
配列の定義と初期化
let numbers: [i32; 5] = [1, 2, 3, 4, 5];
let zeros = [0; 10];
配列は[type; length]の形式で定義されます。
typeは要素の型、lengthは配列の長さを示します。
また、[value; length]の形式を使うと、指定した値で初期化された配列を作成できます。
配列へのアクセスと操作
let first = numbers[0];
let last = numbers[4];
for num in &numbers {
println!("{}", num);
}
配列の要素にはインデックスを使ってアクセスします。
Rustではインデックスが範囲外の場合にパニックが発生するため、範囲外のアクセスには注意が必要です。
ループやイテレータを使って配列を反復処理することが可能です。
スライス(Slice)
スライスは配列やベクターの一部への参照を提供するデータ構造です。
スライスは可変長であり、所有権を持たないため、配列やベクターの内容を直接操作することができません。
スライスの定義と初期化
let numbers = [1, 2, 3, 4, 5];
let slice = &numbers[1..4];
スライスは、配列やベクターの一部への参照として定義されます。
範囲[start..end]を指定すると、startからend-1までの部分を表すスライスが生成されます。
スライスへのアクセスと操作
let first = slice[0];
for item in slice {
println!("{}", item);
}
スライスの要素へのアクセスは配列と同様にインデックスを使います。スライスも範囲外のインデックスを指定するとパニックが発生します。
Rustの案件を探すならクラウドワークス テック
注意点
固定長と可変長
配列は固定長であり、定義後に長さを変更することはできません。
一方、スライスは可変長ですが、スライス自体の長さを変更することはできません。
所有権とライフタイム
配列は所有権を持ちますが、スライスは参照を表すため、所有権を持ちません。
スライスを使用する場合は、参照のライフタイムに注意し、元のデータが存在している間だけスライスを使用することが必要です。
範囲外のインデックス
配列やスライスで範囲外のインデックスを使用すると、パニックが発生します。
インデックスの範囲チェックを行うか、スライスの長さを確認することが必要になります。
Rustをもっと詳しくなりたい方に
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
個人的には他の言語開発もそれなりにあったことからこの本を読むことでかなりRustへの理解が深まりました。
プログラムやシステム的な専門用語は当たり前に登場するものの、他の言語での開発経験がある方なら問題ないでしょう。むしろその経験があることで、多言語との比較をしながら読み進めることができます。
内容的には大容量かつ丁寧すぎるほど嚙み砕いて説明がされているため、情報量は十分といえます。Rust自体学習コストが高く、難易度の高い言語のためこのくらいが妥当といえます。
プログラミング初心者レベルの方には難しい内容となっていますが、Rustの概念を理解し、基礎を把握することができる本であること間違いなしです。
Rust学習のために筆者が実際に読んでおすすめしたい本をまとめています。
基礎から学ぶRustプログラミング入門
本コースではRustについて全く経験がない方でもスムーズに学習を進められるようにとなっています。
基本的にはコードベースで解説を行い、抽象度が高く難しい内容に関しては適宜スライドも使いながら丁寧に解説します。そしてただ文法を学ぶだけではなく、最終的には演習としてCLIアプリケーションを作成し学習内容の定着を図ります。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。