【问题标题】:How to elide inferable trait generics in rust如何在 rust 中省略可推断的特征泛型
【发布时间】:2021-12-29 02:57:45
【问题描述】:

假设我有以下特征,我有一堆具体的实现。对于每个具体的 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 {}

【问题讨论】:

  • 问题在于泛型与您所描述的完全相反的行为:多个impls 具有不同的泛型。你使用了错误的工具。您应该使用关联类型。见their RFC
  • 感谢您为我指明此模式的正确名称。问题中的示例实际上是对我之前在 TokenHolder 不是通用的情况下的改进,并且我到处传递 Hs 和 Ts 没有任何强制它们的耦合????‍♂️。跨度>

标签: generics rust


【解决方案1】:

这实际上无法使用泛型来实现,但可以与associated type 中的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 的评论更新为使用官方术语。

【讨论】:

    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多