希望对于 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)确实是不受约束的废话,但在某种程度上我目前不明白...
如果认为有帮助,很乐意提供更多信息和背景!
不受约束。
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