問題一覧に戻る
上級ジェネリクス
問題96: 関連型

関連型はトレイト内で型プレースホルダを定義します。ジェネリックパラメータと異なり、呼び出し側ではなく実装側が決定します。実装ごとに論理的な型が一つしかない場合、より整理されたAPIを作成します。関連型は型パラメータの増殖を減らし、トレイト境界をより読みやすくします。Iterator、Future、その他の標準トレイトでよく使用されます。

// 関連型を持つトレイト
trait Container {
type ;

fn get(&self) -> &Self::;
}

// 関連型の実装
struct StringWrapper(String);

impl Container for StringWrapper {
type Item = ;

fn get(&self) -> & {
&self.0
}
}

// 境界での関連型の使用
fn print_item<C: Container>(c: &C)
where
C::: std::fmt::Display
{
println!("{}", c.get());
}

fn main() {
let s = StringWrapper("Hello".to_string());
print_item(&s);
}