やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

RustのコレクションVec型

 Vector。可変配列。

成果物

コード

空値

let v = Vec::new();
let v: Vec<i32> = Vec::new();

初期値

let v = vec![1,2,3];
let v: Vec<i32> = vec![1,2,3];

println!

let v = vec![1,2,3];
println!("{:?}", v);

vec.push()

let v = Vec::new();
v.push(1);

参照

正常

let v: Vec<i32> = vec![1,2,3,4,5];

let third: &i32 = &v[2];
println!("{:?}", third); // 3

let third: Option<&i32> = v.get(2);
println!("{:?}", third); // Some(3)

 参照するには以下の2種類の方法がある。

  • &v[添字]
  • v.get(添字)

異常

    // 実行時エラー
//    let not_exist = &v[100]; // thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 100'
    let not_exist = v.get(100); // Option::None
    println!("{:?}", not_exist);

 &v[添字]のほうは実行時エラー(パニック)になる。

可変と不変は同居できない

    // 可変と不変の参照は同一スコープ内に存在できない(矛盾するから)
    let mut v = vec![1,2,3,4,5];
    let first = &v[0];
    v.push(6); // error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
 ```

## 要素を走査する

### 不変
let v: Vec<i32> = vec![100, 32, 57];
for item in &v {
    println!("{}", item);
}
println!("{:?}", v); // [100, 32, 57]
### 可変
let mut v: Vec<i32> = vec![100, 32, 57];
for item in &mut v {
    *item += 50;
    println!("{}", item);
}
println!("{:?}", v); // [150, 82, 107]
## 異なる型を保持する

fn main() { // 異なる型を保持する方法(enum) let row = vec![ SpreadsheetCell::Int(1), SpreadsheetCell::Float(3.14), SpreadsheetCell::Text(String::from("hello")), ]; } enum SpreadsheetCell { Int(i32), Float(f64), Text(String), }

 enumの各要素でタプル構造体をもたせる。

# 前回まで

* [Rustを学んでみたい(プログラミング言語)](http://ytyaru.hatenablog.com/entry/2020/07/15/000000)
* [Rustの環境構築](http://ytyaru.hatenablog.com/entry/2020/07/16/000000)
* [RustでHelloWorld](http://ytyaru.hatenablog.com/entry/2020/07/17/000000)
* [Rustの和訳ドキュメント](http://ytyaru.hatenablog.com/entry/2020/07/18/000000)
* [Cargoでプロジェクト作成・ビルド・実行](http://ytyaru.hatenablog.com/entry/2020/07/19/000000)
* [クレートとは?](http://ytyaru.hatenablog.com/entry/2020/07/20/000000)
* [Rustで関数を使ってみる](http://ytyaru.hatenablog.com/entry/2020/07/21/000000)
* [Rustでモジュールを使ってみる](http://ytyaru.hatenablog.com/entry/2020/07/22/000000)
* [Rustで乱数を生成する(rand)](http://ytyaru.hatenablog.com/entry/2020/07/23/000000)
* [Rustで標準入力する(std::io::stdin().read_line())](http://ytyaru.hatenablog.com/entry/2020/07/24/000000)
* [RustでMatch判定する(match)](http://ytyaru.hatenablog.com/entry/2020/07/25/000000)
* [Rustでprintとread_lineを1行にする方法](http://ytyaru.hatenablog.com/entry/2020/07/26/000000)
* [Rustで数当てゲーム](http://ytyaru.hatenablog.com/entry/2020/07/27/000000)
* [クレート名にドット.が使えない](http://ytyaru.hatenablog.com/entry/2020/07/28/000000)
* [Rustの変数と可変性(let, mut) error[E0384]: cannot assign twice to immutable variable `x`](http://ytyaru.hatenablog.com/entry/2020/07/29/000000)
* [Rustのimmutable束縛とconst定数の違い](http://ytyaru.hatenablog.com/entry/2020/07/30/000000)
* [RustのREPL、evcxrのインストールに失敗した](http://ytyaru.hatenablog.com/entry/2020/07/31/000000)
* [Rustでコンパイルするときの変数未使用warningを消す](http://ytyaru.hatenablog.com/entry/2020/08/01/000000)
* [Rustの変数(再代入、再宣言(シャドーイング))](http://ytyaru.hatenablog.com/entry/2020/08/02/000000)
* [Rustのシャドーイングについて](http://ytyaru.hatenablog.com/entry/2020/08/03/000000)
* [イミュータブルについて(副作用)](http://ytyaru.hatenablog.com/entry/2020/08/04/000000)
* [Rustの定数(const)](http://ytyaru.hatenablog.com/entry/2020/08/05/000000)
* [Rustのデータ型(数値)](http://ytyaru.hatenablog.com/entry/2020/08/06/000000)
* [Rustのデータ型(論理)](http://ytyaru.hatenablog.com/entry/2020/08/07/000000)
* [Rustのデータ型(文字)](http://ytyaru.hatenablog.com/entry/2020/08/08/000000)
* [Rustのデータ型(タプル)](http://ytyaru.hatenablog.com/entry/2020/08/09/000000)
* [Rustのデータ型(配列)](http://ytyaru.hatenablog.com/entry/2020/08/10/000000)
* [Rustの関数](http://ytyaru.hatenablog.com/entry/2020/08/11/000000)
* [Rustのif式](http://ytyaru.hatenablog.com/entry/2020/08/12/000000)
* [Rustのくりかえし文(loop)](http://ytyaru.hatenablog.com/entry/2020/08/13/000000)
* [Rustのくりかえし文(while)](http://ytyaru.hatenablog.com/entry/2020/08/14/000000)
* [Rustのくりかえし文(for)](http://ytyaru.hatenablog.com/entry/2020/08/15/000000)
* [Rustの所有権(ムーブ)](http://ytyaru.hatenablog.com/entry/2020/08/16/000000)
* [Rustの所有権(関数)](http://ytyaru.hatenablog.com/entry/2020/08/17/000000)
* [Rustの所有権(スライス)](http://ytyaru.hatenablog.com/entry/2020/08/18/000000)
* [Rustの構造体(定義とインスタンス化)](http://ytyaru.hatenablog.com/entry/2020/08/19/000000)
* [Rustの構造体(プログラム例)](http://ytyaru.hatenablog.com/entry/2020/08/20/000000)
* [Rustの構造体(メソッド)](http://ytyaru.hatenablog.com/entry/2020/08/21/000000)
* [Rustの列挙型(enum)](http://ytyaru.hatenablog.com/entry/2020/08/22/000000)
* [Rustの列挙型(enum)](http://ytyaru.hatenablog.com/entry/2020/08/22/000000)
* [Rustの列挙型(enum)](http://ytyaru.hatenablog.com/entry/2020/08/22/000000)
* [Rustのmatch(制御フロー演算子)](http://ytyaru.hatenablog.com/entry/2020/08/23/000000)
* [RustでNULLを扱う(Option, Some, None)](http://ytyaru.hatenablog.com/entry/2020/08/24/000000)
* [NULL参照は10億ドルの失敗だった](http://ytyaru.hatenablog.com/entry/2020/08/25/000000)
* [Rustの列挙型に独自表示を実装する(E0277 対策 std::fmt::Display 実装)](http://ytyaru.hatenablog.com/entry/2020/08/26/000000)
* [RustのIfLet(matchの糖衣構文)](http://ytyaru.hatenablog.com/entry/2020/08/27/000000)
* [Rustのプロジェクト構造](http://ytyaru.hatenablog.com/entry/2020/08/28/000000)
* [Rustのcargoでライブラリ&テスト(単体、結合)](http://ytyaru.hatenablog.com/entry/2020/08/29/000000)
* [Rustのモジュール(mod)](http://ytyaru.hatenablog.com/entry/2020/08/30/000000)
* [Rustのモジュール(pub)](http://ytyaru.hatenablog.com/entry/2020/08/31/000000)
* [Rustのmod参照方法(`mod 子モジュール名;`, `use 要素名;`, `extern crate クレート名;`, `super`)](http://ytyaru.hatenablog.com/entry/2020/09/01/000000)
* [Rustのインポートまとめ(Rust2018)](http://ytyaru.hatenablog.com/entry/2020/09/02/000000)