位置型JSON配列のためのRustタプル構造体

座標やRGBトリプルなど、固定長で異種要素のJSON配列にはタプル構造体を使います。

Type Mapping

詳細な説明

位置型JSON配列のためのタプル構造体

緯度経度ペア、RGBトリプル、行列の行など、JSON API は固定形のデータを位置型配列で表現することがあります。Rust のタプル構造体はこれにぴったりです。

JSONの例

{
  "color": [255, 128, 0],
  "location": [40.7128, -74.0060]
}

自動生成された出力(リファクタ前)

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub color: Vec<i32>,
    pub location: Vec<f64>,
}

タプル構造体に昇格

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Color(pub u8, pub u8, pub u8);

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Location(pub f64, pub f64);

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub color: Color,
    pub location: Location,
}

なぜわざわざ

長さ3の Vec<i32> は、概念的には座標とは別物です。タプル構造体ならコンパイラが Color(255, 128)(チャネル不足)を弾いてくれますし、color.0color.1color.2 という自然なアクセスも得られます。

素のタプル vs タプル構造体

素のタプル (u8, u8, u8) も serde では配列としてシリアライズされますが、メソッドを持たせたり名前付き型としてエクスポートすることはできません。色、点、音声サンプルなどドメイン的な意味を持つ場合はタプル構造体、その場限りの匿名ペアであれば素のタプルを使い分けてください。

固定長配列

性能に厳しいコードでは、[u8; 3](Vec ではなく配列)にするとヒープ確保が完全に省けます。serde も対応しており、サイズ不一致は実行時パニックではなくコンパイルエラーになります。

ユースケース

幾何処理、コンピュータグラフィックス、信号処理、位置型エンコーディングを使うあらゆる科学計算データはタプル構造体の恩恵を受けます。Vec<T> よりも小さく、速く、自己説明的です。

試してみる — JSON to Rust Struct Converter

フルツールを開く