2016-05-16 38 views
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`. 

的完整代码:https://github.com/shterrett/efficient_route_planning/blob/generic-graph/src/connected_component.rs#L19

据我所知,一切应该是&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) 

回答

4

的问题似乎是这里

let connected_nodes = explore_from(&root, &graph); 

untested_nodes.iter().next()回报Option<&T>,所以比赛Some(root)使得root: &T。这意味着&root&&T,推测的Texplore_from&TTreducer)。我预计从root删除参考修复此问题:

let connected_nodes = explore_from(root, &graph); 
相关问题