为什么我的 impl 块中的类型参数不受约束?

问题描述 投票:0回答:1

希望对于 Rust 泛型向导来说这是一个简单的问题。我希望为任何可以借用为我的

Display
类型的东西编写一个
Offset
impl(例如
Offset
&Offset
Box<Offset>
等)。并提出以下建议:

impl<O, C> Display for Modification<O>
where
    O: Borrow<Offset<C>>,
    C: Display,

我认为造成这里问题的是我的

Offset
结构有一个类型参数,并且该参数需要实现
Display
才能实现整体
Modification<O>
的目的。

照原样,此代码会生成错误:

error[E0207]: the type parameter `C` is not constrained by the impl trait, self type, or predicates
  --> crates/polychem/src/polymers/modification.rs:42:9
   |
42 | impl<O, C> Display for Modification<O>
   |         ^ unconstrained type parameter

从我的角度来看,它确实受到 impl 谓词的限制,而且效果很好:

impl<O, C> Display for Modification<O>
where
    O: Borrow<C>,
    C: Display,

因此,将通用结构放入混合中要么(1)揭示了 Rust 特征解决的局限性,要么(更有可能)(2)确实是不受约束的废话,但在某种程度上我目前不明白...

如果认为有帮助,很乐意提供更多信息和背景!

generics rust traits borrow-checker
1个回答
0
投票

不受约束。

Rust 要求给定的特征对于一个类型最多实现一次。然而,这个

impl
块允许通过改变
Display
类型来无限数量地实现
Modification<O>
C

因为

Borrow
是通用的,所以
O
表示的具体类型可以针对不同类型
Borrow<Offset<A>>
Borrow<Offset<B>>
实现
A
B
impl
块应该选择哪一个?没有明确的方法来决定,因此这个
impl
是不允许的。

从我的角度来看,它确实受到 impl 谓词的限制,而且效果很好

不,这也失败了

error[E0207]: the type parameter `C` is not constrained by the impl trait, self type, or predicates
 --> src/lib.rs:6:9
  |
6 | impl<O, C> Display for Modification<O>
  |         ^ unconstrained type parameter
© www.soinside.com 2019 - 2024. All rights reserved.