如何在 Rust 中消除可推断的特征泛型
How to elide inferable trait generics in rust
假设我有以下特征,我有一堆具体的实现。对于每个具体的 TokenParser,只有一个具体的 TokenHolder。
trait Token {}
trait TokenHolder<T: Token> {}
trait TokenParser<H: TokenHolder<T>, T: Token> {}
我有一堆使用 TokenParser 的代码,想减少我拥有的样板文件的数量。我觉得应该有一种方法可以做到这一点
trait TokenParser<H: TokenHolder<T: Token>> {}
// or
trait TokenParser<H: TokenHolder<T>> where T: Token {}
这无法使用泛型真正实现,但可以在 TokenHolder
中与 associated type 一起使用
trait TokenHolder {
type Token: Token;
}
trait TokenParser<H: TokenHolder> {
// This signature demonstrates using the type on the holder
// in the signature for the parser.
fn extract_token(holder: H) -> H::Token;
}
已更新
根据 Chayim Friedman 的评论更新为使用官方术语。
假设我有以下特征,我有一堆具体的实现。对于每个具体的 TokenParser,只有一个具体的 TokenHolder。
trait Token {}
trait TokenHolder<T: Token> {}
trait TokenParser<H: TokenHolder<T>, T: Token> {}
我有一堆使用 TokenParser 的代码,想减少我拥有的样板文件的数量。我觉得应该有一种方法可以做到这一点
trait TokenParser<H: TokenHolder<T: Token>> {}
// or
trait TokenParser<H: TokenHolder<T>> where T: Token {}
这无法使用泛型真正实现,但可以在 TokenHolder
trait TokenHolder {
type Token: Token;
}
trait TokenParser<H: TokenHolder> {
// This signature demonstrates using the type on the holder
// in the signature for the parser.
fn extract_token(holder: H) -> H::Token;
}
已更新
根据 Chayim Friedman 的评论更新为使用官方术语。