gpt4 book ai didi

rust - "expected type parameter, found struct"

转载 作者:行者123 更新时间:2023-11-29 07:45:31 26 4
gpt4 key购买 nike

我一直在使用 Rust 处理 traits,我遇到了一个问题。这是一些代码:

struct Foo;

trait Bar {}

impl Bar for Foo {}

fn bar<B: Bar>(bar: B) {}

fn barr<B: Bar>() {
bar(Foo); // 1. THIS WILL WORK
let foo: B = Foo; // 2. THIS WILL NOT WORK
let foo_vec: Vec<B> = vec![Foo]; // 3. THIS WILL NOT WORK
}

这会产生错误:

error[E0308]: mismatched types
--> src/main.rs:11:18
|
11 | let foo: B = Foo; // 2. THIS WILL NOT WORK
| ^^^ expected type parameter, found struct `Foo`
|
= note: expected type `B`
found type `Foo`

error[E0308]: mismatched types
--> src/main.rs:12:32
|
12 | let foo_vec: Vec<B> = vec![Foo]; // 3. THIS WILL NOT WORK
| ^^^ expected type parameter, found struct `Foo`
|
= note: expected type `_`
found type `Foo`

为什么 #2 和 #3 不起作用?我怎样才能让编译器知道 Foo 实际上有一个 Bar impl


另一个例子:

struct Foo<B: Bar> {
bar: Option<B>,
}

struct Foo2;

trait Bar {}

impl<B: Bar> Bar for Foo<B> {}

impl Bar for Foo2 {}

fn bar<B: Bar>(bar: B) {}

fn circle_vec<B: Bar>() {
bar(Foo2); // 1. WORKS
Foo { bar: Some(Foo { bar: None }) }; // 2. WILL NOT WORK
}

这会给我这个错误:

error[E0282]: type annotations needed
--> src/main.rs:17:21
|
17 | Foo { bar: Some(Foo { bar: None }) }; // 2. WILL NOT WORK
| ^^^ cannot infer type for `B`

最佳答案

你有两个不同的问题,所以我想我会写两个不同的答案。


在您的第一个代码示例中,2 和 3 不起作用,因为 B 是一个输入 类型参数;它是 barr 的来电者这决定了 B 是什么。但是,您试图将其强制为 Foo .

假设我们有另一个 Bar 的实现:

struct Quux;

impl Bar for Quux {}

假设我们调用barr像这样:

barr::<Quux>()

barr基本上会被编译成这样:

fn barr() {
bar(Foo);
let foo: Quux = Foo;
let foo_vec: Vec<Quux> = vec![Foo];
}

FooQuux不兼容,Vec<Foo>Vec<Quux>也不兼容。

如果您尝试创建一个任意向量 Bar对象,你需要使用 Bar以一种非通用的方式。由于特征类型未调整大小,您不能将它们直接存储在 Vec 中。 , 所以你必须使用 Vec<Box<Bar>> , Vec<&Bar>或其他一些包装指针的类型。

fn barr() {
bar(Foo);
let foo: Box<Bar> = Box::new(Foo);
let foo_vec: Vec<Box<Bar>> = vec![Box::new(Foo) as Box<Bar>];
}

在您的第二个代码示例中,错误是 None类型为 Option<T> ,并且编译器无法为 T 推断出合适的类型.我们可以明确指定 T像这样:

fn circle_vec<B: Bar>() {
bar(Foo2);
Foo {
bar: Some(Foo { bar: None::<Foo2> }),
};
}

关于rust - "expected type parameter, found struct",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26049939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com