【Rust】タプル型、配列型

1. 概要 

今回はRustのタプル型、配列型について学んでいきたいと思います。

2. タプル型

タプルとは、複巣の型の要素を持てる複合型です。

タプル型の変数を定義するときは、「let 変数名 = (値1, 値2, …)」と書きます。タプル型の変数にアクセスする場合は、「変数.0」と書きます。配列のように、「変数[i]」といった書き方はできないので、for文などで使用することはできないので注意が必要です。

fn main() {
    // タプルを作成
    let tuple = ("リンゴ", 5, 100);

    // タプルを出力
    println!("{:?}", tuple);

    // 各要素へアクセス
    println!("--- 各要素へアクセス ---");
    println!("商品:{}", tuple.0);
    println!("個数:{}", tuple.1);
    println!("値段:{}", tuple.2);

    // 分配
    println!("--- 分配 ---");
    let (商品, 個数, 値段) = tuple;
    println!("商品 = {}", 商品);
    println!("個数 = {}", 個数);
    println!("値段 = {}", 値段);
}

実行します。

cargo run

結果

   Compiling hello_rust v0.1.0 (/Users/ryoutaookawa/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.47s
     Running `target/debug/hello_rust`
("リンゴ", 5, 100)

--- 各要素へアクセス ---
商品:リンゴ
個数:5
値段:100

--- 分配 ---
商品 = リンゴ
個数 = 5
値段 = 100

問題なく実行できました。各要素へのアクセスは難しくなく簡単でした。ちなみにRustは変数名に日本語や韓国語を使用することもできます。

タプルを出力するとき、「println!(“{:?}”)」と書いています。「{:?}」はデバッグ出力のフォーマットです。次のプログラムのように、デバッグ出力のフォーマットを指定せずにタプルを出力すると、どうなるでしょうか。

fn main() {
    // タプルを作成
    let tuple = ("リンゴ", 5, 100);

    // タプルを出力
    println!("{}", tuple);
}

実行します。

cargo run

結果

   Compiling hello_rust v0.1.0 (<作業ディレクトリ>/hello_rust)
error[E0277]: `(&str, {integer}, {integer})` doesn't implement `std::fmt::Display`
 --> src/main.rs:6:20
  |
6 |     println!("{}", tuple);
  |                    ^^^^^ `(&str, {integer}, {integer})` cannot be formatted with the default formatter
  |
  = help: the trait `std::fmt::Display` is not implemented for `(&str, {integer}, {integer})`
  = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
  = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0277`.
error: could not compile `hello_rust` due to previous error

デフォルトのフォーマットではダメだと言われました。そして「{:?}」または「{:#?}」のフォーマットを使うようにと言われてます。

3. 配列型

配列もタプルと同様に複合型です。タプルと異なる点は、全要素が同じ型でなければいけません。また、Rustの配列は、固定長なので、宣言後にサイズを伸ばしたり、縮めたりすることはできません。

定義する際は、「let 変数名 = [値1, 値2, …]」と書きます。

fn main() {
    // 配列を作成
    let array = [1, 2, 3, 4, 5];

    // 配列を出力
    println!("{:?}", array);

    println!("--- 要素へアクセス ---");
    println!("1番目:{}", array[0]);
    println!("2番目:{}", array[1]);
    println!("3番目:{}", array[2]);
    println!("4番目:{}", array[3]);
    println!("5番目:{}", array[4]);

    println!("--- for文で各要素を出力 ---");
    for i in array {
        println!("{}番目 = {}", i, i);
    }

    // 配列の長さを出力
    println!("--- 配列の長さ ---");
    println!("length = {}", array.len());
}

実行します。

cargo run

結果

   Compiling hello_rust v0.1.0 (<作業ディレクトリ>/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.22s
     Running `target/debug/hello_rust`
[1, 2, 3, 4, 5]

--- 要素へアクセス ---
1番目:1
2番目:2
3番目:3
4番目:4
5番目:5

--- for文で各要素を出力 ---
1番目 = 1
2番目 = 2
3番目 = 3
4番目 = 4
5番目 = 5

--- 配列の長さ ---
length = 5

配列の使い方は、他の言語とあまり変わらないです。Rust以外の言語を使ったことのあるプログラマーであればすぐわかると思います。

4. 文字列フォーマット

print!マクロ、println!マクロ、format!マクロで使用できるフォーマットです。

書式説明
{:<n}n桁で左寄せ
{:>n}n桁で右寄せ
{:^n}n桁で中央寄せ
{:<0n}n桁で左寄せ(0埋め)
{:>0n}n桁で右寄せ(0埋め)
{:b}2進数
{:0nb}2真数でn桁0埋め
{:o}8進数
{:x}16進数
{:0nx}16進数でn桁0埋め
{:.n}小数点以下をn桁
{:e}指数表現
{:?}デバッグ出力
{:#?}デバッグ出力(成形)
{{{ を出力
}}} を出力
{:p}ポインタ

5. まとめ

今回は、タプルと配列についてやりました。他の言語での使い方とそんなに変わらないので分かりやすいです。あと、文字列フォーマットはたくさんあるので、用途によっていろいろできるのですごく便利でした。

投稿者プロフィール

OkawaRyouta
最新の投稿

関連記事

  1. 【Rust】Unsafe Rust

  2. 【Rust】ベクタ、スライス

  3. 【Rust】所有権システム、所有権の移動

  4. 【Rust】変数、定数、シャドーイング

  5. 【Rust】構造体

  6. 【Rust】整数型、浮動小数点型

最近の記事

  1. flutter

制作実績一覧

  1. Checkeys