【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】変数、定数、シャドーイング

  2. 【Rust】借用と参照、ライフタイム

  3. 【Rust】環境構築と、Hello World!

  4. 【Rust】構造体

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

  6. 【Rust】Unsafe Rust

最近の記事

  1. AWS
  2. AWS
  3. AWS
  4. AWS
  5. AWS
  6. AWS
  7. AWS

制作実績一覧

  1. Checkeys