如何将通用特征设置为函数参数的类型?
How to set generic trait as type of function argument?
有通用特征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 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");
// ...
}
我用 &str
类型创建了一个 AdjacencyList
的实例,并将其发送给函数。
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);
~~~~~~~~~~~~~~
如何将特征设置为函数参数的一种类型,并向其传递实现该特征的结构?
你需要通过&mut adjacency_list
。这就是错误的意思,它是正确的:您已将函数定义为采用 &mut
指针,但您直接传递了该值。
有通用特征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 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");
// ...
}
我用 &str
类型创建了一个 AdjacencyList
的实例,并将其发送给函数。
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);
~~~~~~~~~~~~~~
如何将特征设置为函数参数的一种类型,并向其传递实现该特征的结构?
你需要通过&mut adjacency_list
。这就是错误的意思,它是正确的:您已将函数定义为采用 &mut
指针,但您直接传递了该值。