Extension Trait パターンは Rust でよく使われるデザインパターンである。

既存の型やトレイトに後付けでのメソッドの追加を可能にする。外部クレートが提供する型やトレイトに対し、その利用者が「こんなメソッドもあれば良かったのに…」と思うような補助目的のメソッドを追加するのによく使われる。

使用例

型の拡張

以下は f32 型の拡張例 (NaN を指定した値へ変換するメソッドを追加)。


fn main() {
    let x = f32::NAN;
    assert_eq!(x.map_nan(0.0), 0.0);
}

pub trait F32Ext {
    fn map_nan(self, substitute: f32) -> f32;
}

impl F32Ext for f32 {
    fn map_nan(self, substitute: f32) -> f32 {
        if self.is_nan() { substitute } else { self }
    }
}

トレイトの拡張

以下は ToString トレイトの拡張例 (値を大文字で出力するメソッドを追加)。


fn main() {
    let x = "test";
    assert_eq!(x.to_upper_string(), "TEST");
}

pub trait ToStringExt: ToString {
    fn to_upper_string(&self) -> String {
        self.to_string().to_uppercase()
    }
}

impl<T: ToString> ToStringExt for T {
    // NOP.
}