2016-01-28 2 views
0

Существует Generic черта 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"); 
    // ... 
} 

Я создаю экземпляр 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); 
        ~~~~~~~~~~~~~~ 

Как я могу установить признак как тип аргумента функции и передать там структуру, которая реализует эту черту?

ответ

3

Необходимо пройти &mut adjacency_list. Это то, о чем говорит ошибка, и это правильно: вы определили функцию как принимающую указатель &mut, но вы передаете значение напрямую.

+0

Да. Ты прав! Я новичок в ржавчине, и его правила собственности для меня не очевидны. Из-за этого я часто ищу ответы на неправильные вопросы. Большое спасибо. –

Смежные вопросы