Rustの基礎 - タプル

提供: MochiuWiki : SUSE, EC, PCB

2025年11月30日 (日) 03:41時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == タプルとは、複数の異なる型の値を1つの複合型にまとめて管理することができる。<br> タプルの各要素は異なる型を持つことができるのが特徴である。<br> <br> Rustのタプルは固定長であり、1度宣言されるとサイズを変更することができない。<br> <br><br> == タプルの定義 == タプルを作成するには丸括弧()を使用する。<br> この中に、カンマで…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

概要

タプルとは、複数の異なる型の値を1つの複合型にまとめて管理することができる。
タプルの各要素は異なる型を持つことができるのが特徴である。

Rustのタプルは固定長であり、1度宣言されるとサイズを変更することができない。


タプルの定義

タプルを作成するには丸括弧()を使用する。
この中に、カンマで要素を区切る。

let タプル名 = (要素1, 要素2, 要素3, ...) という形になる。

また、空のタプルを作成するには、丸括弧()のみで宣言する。

 fn main() {
    let t1 = (1, 3, 5, 3, 7, 5);
    let t2 = (2, 7, 8, 3, 9, 1);
    let t3 = ();
 
    println!("{:?}", t1);
    println!("{:?}", t2);
    println!("{:?}", t3);
 }
 
 // 出力
 (1, 3, 5, 3, 7, 5)
 (2, 7, 8, 3, 9, 1)
 ()


タプルの要素にアクセスするには、ドット記法とインデックスを使用する。
インデックスは0から始まる。

 fn main() {
    let t = (10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
    println!("{}", t.2);
 
    // スライスは直接サポートされていないため、必要な要素を個別に取得する
    let slice = (t.3, t.4, t.5, t.6, t.7);
    println!("{:?}", slice);
 }
 
 // 出力
 30
 (40, 50, 60, 70, 80)


要素が1つだけのタプルを作成する場合も、通常通り丸括弧を使用する。

 fn main() {
    let x = (200,);
    let y = (300,);
    println!("{:?}", x);
    println!("{:?}", y);
 }
 
 // 出力
 (200,)
 (300,)


※注意
Rustのタプルは最大12要素まで標準的なトレイトが実装されている。

異なる型の要素を混在させることができる。

 // 例
 let t = (1, "hello", 3.14);


要素へのアクセスはインデックス演算子 [] ではなく、ドット記法 tuple.0 を使用する。

また、スライス操作は直接サポートされていない。


タプルの操作

※注意
Rustのタプルには、Pythonの`index()`や`count()`のようなメソッドは存在しない。
タプル同士の結合演算子 + は存在しないため、結合したい場合は新しいタプルを作成する必要がある。

タプルの分解

タプルの要素を個別の変数に分解することができる。

以下の例では、タプルの各要素を変数に代入している。

 fn main() {
    let t = (1, 2, 4, 6, 8);
    let (a, b, c, d, e) = t;
    println!("a = {}, b = {}, c = {}, d = {}, e = {}", a, b, c, d, e);
 }
 
 // 出力
 a = 1, b = 2, c = 4, d = 6, e = 8


必要な要素のみを取得し、残りを無視する場合は _ (アンダースコア) を使用する。

 fn main() {
    let t = (1, 2, 4, 6, 8);
    let (first, _, third, _, _) = t;
    println!("first = {}, third = {}", first, third);
 }
 
 // 出力
 first = 1, third = 4


タプルと可変性

Rustのタプル自体はイミュータブル(不変)だが、mut キーワードを使用することにより、要素を変更可能にできる。

以下の例では、可変タプルの要素を変更している。

 fn main() {
    let mut t = (1, 2, 3);
    println!("{:?}", t);
 
    t.0 = 100;
    t.1 = 200;
    println!("{:?}", t);
 }
 
 // 出力
 (1, 2, 3)
 (100, 200, 3)


異なる型を持つタプル

Rustのタプルは異なる型の要素を格納できる。

以下の例では、整数、文字列、浮動小数点数を1つのタプルに格納している。

 fn main() {
    let t = (42, "hello", 3.14, true);
    println!("{:?}", t);
    println!("整数: {}, 文字列: {}, 浮動小数点数: {}, 真偽値: {}", t.0, t.1, t.2, t.3);
 }
 
 // 出力
 (42, "hello", 3.14, true)
 整数: 42, 文字列: hello, 浮動小数点数: 3.14, 真偽値: true



タプルの活用

関数の複数の戻り値

タプルを使用すれば、関数から複数の値を返すことができる。

以下の例では、関数が3つの値をタプルとして返している。

 fn get_values() -> (i32, i32, i32) {
    (10, 20, 30)
 }
 
 fn main() {
    let (x, y, z) = get_values();
    println!("x = {}, y = {}, z = {}", x, y, z);
 }
 
 // 出力
 x = 10, y = 20, z = 30


タプルの比較

タプルは要素が同じ型であれば比較演算を行うことができる。
比較は左から順に行われ、最初に異なる要素で結果が決まる。

 fn main() {
    let t1 = (1, 2, 3);
    let t2 = (1, 2, 4);
    let t3 = (1, 2, 3);
 
    println!("t1 == t2: {}", t1 == t2);
    println!("t1 == t3: {}", t1 == t3);
    println!("t1 < t2: {}", t1 < t2);
 }
 
 // 出力
 t1 == t2: false
 t1 == t3: true
 t1 < t2: true