如何将通用特征设置为函数参数的类型?

时间:2016-01-28 14:38:17

标签: generics struct rust traits

有通用特征Graph

type NodeKey = usize;
type EdgeWeight = usize;

trait Graph<T> {
    fn add_node(&mut self, node: T) -> NodeKey;
    fn add_edge(&mut self, begin: NodeKey, end: NodeKey, weight: EdgeWeight);
    fn new() -> Self;
}

及其实现AdjacencyList struct

struct AdjacencyList<T> {
    // ...
}
impl<T> Graph<T> for AdjacencyList<T> {
    // ...
}

我需要一个带空图的函数并用它做一些事情。

fn create_sample_graph<T: Graph<&'static str>>(graph: &mut T) {
    let key1 = graph.add_node("node1");
    // ...
}

我使用AdjacencyList类型创建&str的实例并将其发送到该函数。

fn main() {
    let mut adjacency_list = AdjacencyList::<&str>::new();
    create_sample_graph(adjacency_list);
}

但编译器失败并出现以下错误:

error: mismatched types:
 expected `&mut _`,
    found `AdjacencyList<&str>`
(expected &-ptr,
    found struct `AdjacencyList`) [E0308]
create_sample_graph(adjacency_list);
                    ~~~~~~~~~~~~~~

如何将trait设置为函数参数的一种类型,并传递一个实现此特征的结构?

1 个答案:

答案 0 :(得分:3)

您需要传递&mut adjacency_list。这就是错误所说的,而且它是正确的:你已经将函数定义为采用&mut指针,但是你直接传递了这个值。