見出し画像

タプル・配列・ベクタ

タプル

fn main() {
    // タプル t1とt2は別物
    let t1: (bool, f64, u8) = (true, 6.4, 1);
    let t2: (f64, i32, bool) = (6.4, 1, true);

    // タプルの要素を出力
    println!("タプルの要素は:{:?}", t1);

    // 要素を1つずつ取り出す
    let i = t1.0;
    println!("t1の1つ目の要素は:{}", 1);

    // タプルの要素をまとめて取り出す
    let (x, y, z) = t2;
    println!("t2の3つの要素は、x: {}, y: {}, z: {}", x, y, z);
    let (x, y, _) = t2;
    println!("t2の2つの要素は、x: {}, y: {}", x, y);

    // unit型
    let u: () = ();
    println!("unit型の値は:{:?}", u);

}
$ cargo run

タプルの要素は:(true, 6.4, 1)
t1の1つ目の要素は:1
t2の3つの要素は、x: 6.4, y: 1, z: true
t2の2つの要素は、x: 6.4, y: 1
unit型の値は:()

配列


fn main() {
    // 配列 
    // 配列の型には[i32; 3]のように、要素の型と長さが指定される
    // 一度初期化すると、要素の追加や削除によって要素数を変更することができない
    // -> 変更したい場合は、ベクタを使う
    let l1: [i32; 3] = [1, 2, 3];
    let l2 = [0; 10]; // 10個の0を持つ配列

    println!("l1 = {:?}", l1);

    // 配列の要素にアクセスするには、[]を使う
    println!("l1[0] = {}", l1[0]);
    println!("l2[0] = {}", l2[0]);
    println!("l2[9] = {}", l2[9]);

    // すべての要素をまとめて取得する
    let [x, y, z] = l1;
    println!("l1の要素は、x = {}, y = {}, z = {}", x, y, z);

    // スライス
    let l3 = &l1[0..2];
    println!("&l1[0..2] は {:?}", l3);

    let l4 = &l1[0..=1];
    println!("&l1[0..=1] は {:?}", l4);

    let l4 = &l1[..=1]; // 始めを省略
    println!("&l1[..=1] は {:?}", l4);

    let l4 = &l1[0..]; // 終わりを省略
    println!("&l1[0..] は {:?}", l4);

    // 配列の長さを取得するには、len()メソッドを使う
    println!("l1の長さ = {}", l1.len());
    println!("l2の長さ = {}", l2.len());
    
}
$ cargo run

l1 = [1, 2, 3]
l1[0] = 1
l2[0] = 0
l2[9] = 0
l1の要素は、x = 1, y = 2, z = 3
&l1[0..2] は [1, 2]
&l1[0..=1] は [1, 2]
&l1[..=1] は [1, 2]
&l1[0..] は [1, 2, 3]
l1の長さ = 3
l2の長さ = 10

ベクタ


fn main() {
    // ベクタ
    // ベクタは、可変長の配列で、要素の追加や削除が可能
    // ベクタの型には、Vec<i32>のように、要素の型が指定される
    let v1 = vec![1, 2, 3, 4, 5];
    println!("v1 は {:?}", v1);
    let v2 = vec![0; 5];
    println!("v2 は {:?}", v2);

    // 可変な空のベクタの作成 mut をつける必要がある。
    let mut v3 = Vec::new();

    // ベクタの要素の追加
    v3.push(1);
    v3.push(2);
    v3.push(3);
    println!("v3 は {:?}", v3);

    // ベクタの要素の削除
    let x = v3.pop(); // ベクタから最後の要素を取り出す➡オプション型となる
    println!("v3 を pop した後は {:?}", v3);
    println!("v3 を pop した後の x は {:?}", x);

    // ベクタの要素の参照
    let y = v1[1];
    println!("v1 の 2 番目の要素(let y = v1[1];)は {}", y);
    let z = v1.get(10);
    println!("v1 の 2 番目の要素(let z = v1.get(1);)は {:?}", z);


    // 配列と同じようにスライスができる
    let v1 = vec![1, 2, 3, 4, 5];
    let v1_slice = &v1[1..3];
    println!("v1 の 2 番目から 3 番目の要素は {:?}", v1_slice);
    
}
$ cargo run

v1 は [1, 2, 3, 4, 5]
v2 は [0, 0, 0, 0, 0]
v3 は [1, 2, 3]
v3 を pop した後は [1, 2]
v3 を pop した後の x は Some(3)
v1 の 2 番目の要素(let y = v1[1];)は 2
v1 の 2 番目の要素(let z = v1.get(1);)は None
v1 の 2 番目から 3 番目の要素は [2, 3]

この記事が気に入ったらサポートをしてみませんか?