rust 参数“不受约束”,而它受约束

trnvg8h3  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(115)

我有一个结构Roll<K : Copy + PartialEq, V : Clone, const N : usize>,然后我这样做:

struct Foo;
impl<K : Copy + PartialEq, V : Clone, const N : usize> Foo {
    type Value = Roll<K, V, N>;
    fn bar(self) {
        let mut x : Self::Value = Roll::new();
        x.insert(1, 1);
    }
}

我得到了:

error[E0207]: the type parameter `K` is not constrained by the impl trait, self type, or predicates
 --> src/foo.rs:3:6
  |
3 | impl<K : Copy + PartialEq, V : Clone, const N : usize> Foo {
  |      ^ unconstrained type parameter

这意味着什么以及如何修复?

3pvhb19x

3pvhb19x1#

你要求Rust为每个类型KVN生成一个bar方法,而没有任何方法来区分调用哪个bar。Rust不允许这样做。如果你做了Foo.bar(),你如何告诉Rust使用哪些泛型类型?
如果你有fn bar<K,V,N>(),你可以做Foo.bar::<K,V,N>()。如果Foo是泛型的,你可以做Foo::<K,V,N>.bar()。如果你正在实现一个trait,你可以做<Foo as MyTrait<K,V,N>>.bar()。但是如果你的impl被允许,你就没有办法告诉Rust使用什么类型。
像这样的关联类型在非trait的impl块上没有多大意义。使bar成为泛型,并让它在Roll而不是Self::Value上操作。

相关问题