Aliasing Traits
(2020-04-04) Trait alias は RFC 1733 で導入された。
Rust の Traits による制約は Associated Types や複数の Traits を + で指定したりすると、どんどん長くなってしまう。
struct A<T: Iterator<Item=char>> {
...
}
通常の型には type キーワードによる別名づけの手段が用意されているが、これは Traits には使えない。
type CharIterator = Iterator<Item=char>;
// ERROR: note: `type` aliases cannot be used for traits
struct A<T: CharIterator> {
...
}
過去に提案はあったが却下されたようだ。
Allow type to create an alias for several trait bounds · Issue #8634 · rust-lang/rust
- 別名を与えたい Trait を継承した空の Trait をつくればいい
- 言語に新しい機能をつけくわえるほどの価値はなさそう
たしかに、空の Trait をつくることで似たような効果を得ることはできる。
trait CharIterator: Iterator<Item=char> {}
struct A<T: CharIterator> {
...
}
ただし、既存の Iterator<Item=char> を実装している型 (std::str::Chars など) は、今回追加した CharIterator を実装しているわけではないので、このままだと T の実体として使うことができない。
「Iterator<Item=char> を実装した型が CharIterator も実装している」という impl を書いておこう。
trait CharIterator: Iterator<Item=char> {}
impl<T: Iterator<Item=char>> CharIterator for T {}
struct A<T: CharIterator> {
it: T,
}
...
let a = A { it: "test".chars() };
参考にした記事