![](https://doc.rust-lang.org/book/second-edition/]
Apache License Version 2.0
Common Collections
8.1 Vectors
Vec<T>
,あるいはvector型は,メモリ上に順番に同じ<T>
型の要素を並べてできるデータ型である.
Creating a New Vector
let v: Vec<i32> = Vec::new();
によって新しいベクトルを作れる.新規作成時に値を代入しない場合,Rustにvectorが保持する型がなんであるか明示的に知らせることができる.初期値を指定してベクトルを作るには,vec!
macroを使う.
let v = vec![1, 2, 3];
Updating a Vector
vectorを作成した後新たに要素を追加するには,push
を使う.
let mut v = Vec::new();
v.push(5);
v.push(6);
v.push(7);
Dropping a Vector Drops its Elements
struct
と同様に,vectorはスコープの外に出ると削除される.
{
let v = vec![1, 2, 3, 4];
} // ここでvは削除される
Reading Elements of Vectors
let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2]; // (1)
let third: Option<&i32> = v.get(2); // (2)
と,2つの方法でvectorの中の値を取得できる.tuppleなどと同様,vectorは0からインデクシングされる.
(1)において,v
の三番目の要素のreferenceをreference型の変数third
に渡している.仮に&v[100]
などとするとpanic!
エラーが生じてクラッシュする.
(2)において,get
methodによってv
の三番目の要素(i32)を取って,Option<T>
に代入している.この場合に&v[100]
としても,(1)と異なり,third
にはNone
が代入されて,クラッシュしない.
Invalid References
src/main.rs
let mut v = vec![1, 2, 3, 4, 5];
let first = &v[0];
v.push(6);
このコードは一見無害だが,実際にコンパイルすると
shell
error[E0502]: cannot borrow `v` as mutable because it is also borrowed as
immutable
|
4 | let first = &v[0];
| - immutable borrow occurs here
5 |
6 | v.push(6);
| ^ mutable borrow occurs here
7 | }
| - immutable borrow ends here
とエラーを生じる.vectorに値を追加するとき,仮に隣接するメモリーが使用中であるなら,一旦vector全てをより広い空間にコピーし,ポインタを貼り直す.このときに,firt=&v[0]
が変更されないままであると,不正な値を参照してしまうので,rustは上のようなコードを許していない.
Using an Enum to Store Multiple Types
vectorは同じ型の値しか入れられないが,enumを使って異なった型の値が入っているように振る舞うことができる.例えば,int, float, stringの値を入れられるスプレッドシートのセルを考える.スプレッドシートの行はvectorと考えることができる.
enum SpreadsheetCell {
Int(i32),
Float(f64),
Text(String),
}
let row = vec! {
SpreadsheetCell::Int(3),
SpreadsheetCell::Text(String::from("blue")),
SpreadsheetCell::float(10.12),
};
上のプログラムでvec!
によってenum型の値が3つ入ったvectorが作られる.
0 件のコメント:
コメントを投稿