Rustの基礎 - タプル
概要
タプルとは、複数の異なる型の値を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