T w-6ren">
gpt4 book ai didi

rust - "expected type parameter, found struct"实现特征时

转载 作者:行者123 更新时间:2023-11-29 08:10:35 30 4
gpt4 key购买 nike

我正在尝试为有向图结构创建特征并提供一个非常基本的实现,但遇到了编译器错误:

pub trait DiGraph<'a> {
type N;
fn nodes<T>(&'a self) -> T where T: Iterator<Item=&'a Self::N>;
fn pre<T>(&'a self, node: Self::N) -> T where T: Iterator<Item=&'a Self::N>;
fn succ<T>(&'a self, node: Self::N) -> T where T: Iterator<Item=&'a Self::N>;
}

struct SimpleNode {
pre: Vec<usize>,
succ: Vec<usize>,
}

pub struct SimpleDiGraph {
pub nodes: Vec<SimpleNode>
}

impl<'a> DiGraph<'a> for SimpleDiGraph {
type N = usize;

fn nodes<T=std::ops::Range<usize>>(&'a self) -> T {
return std::ops::Range { start: 0, end: self.nodes.len() };
}
fn pre<T=std::slice::Iter<'a,usize>>(&'a self, node: usize) -> T {
return self.nodes[node].pre.iter();
}
fn succ<T=std::slice::Iter<'a,usize>>(&'a self, node: usize) -> T {
return self.nodes[node].succ.iter();
}
}

错误信息是:

error[E0308]: mismatched types
--> digraph.rs:21:16
|
21 | return std::ops::Range { start: 0, end: self.nodes.len() };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter, found struct `std::ops::Range`
|
= note: expected type `T`
= note: found type `std::ops::Range<usize>`

error[E0308]: mismatched types
--> digraph.rs:24:16
|
24 | return self.nodes[node].pre.iter();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter, found struct `std::slice::Iter`
|
= note: expected type `T`
= note: found type `std::slice::Iter<'_, usize>`

error[E0308]: mismatched types
--> digraph.rs:27:16
|
27 | return self.nodes[node].succ.iter();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter, found struct `std::slice::Iter`
|
= note: expected type `T`
= note: found type `std::slice::Iter<'_, usize>`

错误消息让我有些困惑——为什么类型参数会被期望为返回值?这仅仅是类型不匹配(例如,由于生命周期)和误导性错误消息吗?

最佳答案

<T=std::ops::Range<usize>>不强制T成为std::ops::Range<usize> ,如果它不知道还可以使用什么,它只会导致它默认为那个。

如果您只想返回 Range<usize> , 然后使用 Range<usize>作为返回类型;根本没有理由使用通用参数。你的代码现在有效地表达的是这样的:

  • “你可以选择任何你想要的返回类型!如果你不在乎,我会返回一个 range<usize> 。”
  • “我希望你能返回一个 String,谢谢。”
  • 艰难你得到了一个range<usize>!”
  • “……但是你说……”
  • 我撒谎了!MUAHAHAHAHAHA!

如果您实际上希望调用者选择返回类型,那么您需要准备返回任何 T ...这几乎是不可能的,因为它可能是来自 () 的任何东西至 String到 OpenGL 渲染上下文。

在那种情况下,您实际上想要做的是限制T某些需要类型实现某种构造函数的特征。 Default就是一个例子。

编辑:只是为了加倍澄清:不能选择泛型参数中使用的类型,您的调用者可以。

直到刚才我才注意到您在特征和实现中使用了不同的定义(不要那样做)。我假设您真正想做的是说“此方法返回可用作 Iterator东西,但每个 impl 可以选择不同的类型”您不能使用泛型来做到这一点。

想要的是特征的关联类型,如下所示:

pub trait DiGraph<'a> {
type Nodes;
fn nodes(&'a self) -> Self::Nodes;
}

pub struct SimpleNode {
pre: Vec<usize>,
succ: Vec<usize>,
}

pub struct SimpleDiGraph {
pub nodes: Vec<SimpleNode>
}

impl<'a> DiGraph<'a> for SimpleDiGraph {
type Nodes = std::ops::Range<usize>;

fn nodes(&'a self) -> Self::Nodes {
return std::ops::Range { start: 0, end: self.nodes.len() };
}
}

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

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