PythonやKotlinのように、Rustにもタプルというデータ型が存在します。
本記事ではタプルの使い方とタプル構造体、パターン記法について解説します。
タプルの定義は本来、「順序付けられた複数の要素で構成される組」です。 Rustにおいても、任意の型のデータをグループ化する軽量な方法です。
タプルは特定の名前を持ちません。 名前を付けるとデータ構造は構造体になります。 タプルのフィールドは名前を持ちません。
フィールドへのアクセスは、構造化解除または位置によって行われます。
タプルは常にタプル式で作成されます。
// 特に意味を成しませんが使用可能です
let unit = ();
// 一つの要素を含むものもタプル
let single_element = ("コンマを忘れずに⇨",);
// 要素が二つの一般的なタプル
let two_element = (123, "型の異なる要素も可");
タプルは任意の数の要素を持つことができる。
パターン記法によって各要素にアクセスすることができます。 下記コードのように、タプルの個々の要素に変数名を割り当て使用する事もできます。
let (elem1, _elem2) = two_element; assert_eq!(elem1, 123);
また、タプルの要素に数値の位置インデックスでアクセスすることも可能です。インデックス付けはいつも通り0から始まります。
let notation = single_element.0; assert_eq!(notation, "note the comma");
通常の構造体とは異なり、匿名フィールドを持ちます。
構文は通常のタプルの構文に非常によく似ています。
パターン記法と位置アクセスどちらも使用可能です。
struct TupleStruct(u8, i32); let my_tuple_struct = TupleStruct(123, -321); let neg = my_tuple_struct.1; let TupleStruct(byte, _) = my_tuple_struct; assert_eq!(neg, -321); assert_eq!(byte, 123);
匿名タプルのすべてのフィールドは常にpublicです。
しかし、タプル構造体のフィールドは、標準的な構造体のフィールドと同様に、デフォルトではprivateとなります。
これはpub修飾子を使用してpublicにすることができます。
// プライベートフィールド(コンパイル失敗)
mod tuple { pub struct TupleStruct(u8, i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
// パブリックフィールド(コンパイル成功)
mod tuple { pub struct TupleStruct(pub u8, pub i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
