我想創建一個特徵爲有向圖結構,並提供一個非常基本實現The,但我遇到了編譯器錯誤:「預期的類型參數,發現結構」實現的時候特質
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>`
錯誤信息有點令我困惑 - 爲什麼會預期類型參數作爲返回值?這僅僅是一種類型不匹配(例如由於生命期)與誤導性的錯誤信息?
謝謝,很好的解釋,你猜到了我的正確打算。但是,在你的情況下,節點可以是任何東西,這意味着任何在DiGraphs上運行的函數都不會做太多的工作,因爲它不能對節點做出任何假設。所以我想要做的是限制Nodes獲取N的迭代器(在我的例子中使用,但由調用者定義)。我很高興SimpleDiGraph始終返回範圍對象,但實現DiGraph的其他結構應該能夠通過N返回其他迭代器。有什麼方法可以實現這一目標? –
認爲我想通了,似乎你實際上可以限制特徵類型,例如 _type NodeIterator:Iterator- ; _ 應該這樣做。現在只需要弄清楚生命期問題。 –