如何在 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 的评论更新为使用官方术语。