1
我正在对我编写的Graph
进行通用化。当前签名是意外的T vs&T作为Rust中的类型参数
#[derive(Debug)]
pub struct Graph<T: Clone + Hash + Eq> {
nodes: HashMap<T, Node<T>>,
edges: HashMap<T, Vec<Edge<T>>>
}
#[derive(PartialEq, Debug)]
pub struct Node<T: Clone + Hash + Eq> {
pub id: T,
pub x: f64,
pub y: f64
}
#[derive(PartialEq, Debug)]
pub struct Edge<T: Clone + Hash + Eq> {
pub id: T,
pub from_id: T,
pub to_id: T,
pub weight: i64
}
我在特定函数中使用它,并且调用其他函数时未能编译。
一,用途:
fn reducer<T>(graph: Graph<T>, untested_nodes: HashSet<T>, mut results: Vec<HashSet<T>>) -> Graph<T>
where T: Clone + Hash + Eq {
match untested_nodes.iter().next() {
None => {
collapsed_graph(&graph, &results)
}
Some(root) => {
let connected_nodes = explore_from(&root, &graph);
let difference = untested_nodes.difference(&connected_nodes)
.cloned()
.collect();
results.push(connected_nodes);
reducer(graph,
difference,
results
)
}
}
}
的explore_from
fn explore_from<T: Clone + Hash + Eq>(root: &T, graph: &Graph<T>) -> HashSet<T> {
编译器错误签名:
Compiling efficient_route_planning v0.1.0 (file:///Users/stuart/coding/efficient_route_planning)
src/connected_component.rs:19:55: 19:61 error: mismatched types:
expected `&weighted_graph::Graph<&T>`,
found `&weighted_graph::Graph<T>`
(expected &-ptr,
found type parameter) [E0308]
src/connected_component.rs:19 let connected_nodes = explore_from(&root, &graph);
^~~~~~
src/connected_component.rs:19:55: 19:61 help: run `rustc --explain E0308` to see a detailed explanation
src/connected_component.rs:20:56: 20:72 error: mismatched types:
expected `&std::collections::hash::set::HashSet<T>`,
found `&std::collections::hash::set::HashSet<&T>`
(expected type parameter,
found &-ptr) [E0308]
src/connected_component.rs:20 let difference = untested_nodes.difference(&connected_nodes)
^~~~~~~~~~~~~~~~
src/connected_component.rs:20:56: 20:72 help: run `rustc --explain E0308` to see a detailed explanation
src/connected_component.rs:23:26: 23:41 error: mismatched types:
expected `std::collections::hash::set::HashSet<T>`,
found `std::collections::hash::set::HashSet<&T>`
(expected type parameter,
found &-ptr) [E0308]
src/connected_component.rs:23 results.push(connected_nodes);
^~~~~~~~~~~~~~~
src/connected_component.rs:23:26: 23:41 help: run `rustc --explain E0308` to see a detailed explanation
error: aborting due to 3 previous errors
Could not compile `efficient_route_planning`.
据我所知,一切应该是&Graph<T>
,而不是&Graph<&T>
。我不确定错误在哪里。
版本:
% multirust show override
multirust: default toolchain: stable
multirust: default location: /Users/xxxxxx/.multirust/toolchains/stable
rustc 1.8.0 (db2939409 2016-04-11)
cargo 0.9.0-nightly (8fc3fd8 2016-02-29)