2017年6月29日木曜日

The Rust Programming Language 2nd 10日目 基本的なデータ構造

![](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の三番目の要素のreferencereference型の変数thirdに渡している.仮に&v[100]などとするとpanic!エラーが生じてクラッシュする.
(2)において,getmethodによって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 件のコメント:

コメントを投稿