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.
}