Как обернуть функции с помощью NodeIndex в petgraph

Вопрос новичка: я хочу использовать ящик ржавчины petgraph. График должен быть частью struct MyGraph. Для этого мне нужно обернуть некоторые функции, чтобы сделать их доступными извне:

use petgraph::graph::DiGraph;
use petgraph::adj::NodeIndex;

#[derive(Default)]
struct MyNode {}

#[derive(Default)]
struct MyGraph {
    g: DiGraph<MyNode,()>
}

impl MyGraph {
    pub fn add_node(&mut self, node: MyNode) -> NodeIndex {
        self.g.add_node(node) // does not compile: return value is u32 != NodeIndex
    }
    pub fn update_edge(&mut self, a: NodeIndex, b: NodeIndex) {
        self.g.update_edge(a, b, ()); // does not compile: a: NodeIndex expected, got u32
    }
}
fn main() {
    let mut my_graph=MyGraph::default();
    let node1=my_graph.add_node(MyNode::default());
    let node2=my_graph.add_node(MyNode::default());
    my_graph.update_edge(node1,node2);
}

Однако компилятор ржавчины жалуется на то, что функция self.g.add_node() возвращает u32, что не так, если вы вызываете функцию напрямую (и задокументировано, что она возвращает NodeIndex). Проблема smae относится к функции self.g.update_edge(). Какой правильный тип параметра здесь использовать???

Возвращаемый тип NodeIndex также не работал. (Частичное) сообщение об ошибке компиляции:

...
error[E0308]: arguments to this function are incorrect
   --> src\main.rs:17:16
    |
17  |         self.g.update_edge(a, b, ());
    |                ^^^^^^^^^^^
    |
note: expected struct `NodeIndex`, found `u32`
   --> src\main.rs:17:28
    |
17  |         self.g.update_edge(a, b, ());
    |                            ^
    = note: expected struct `NodeIndex`
                 found type `u32`
...

Что я здесь делаю неправильно?

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы импортируете petgraph::adj::NodeIndex , который является псевдонимом для u32, но вам нужно импортировать petgraph::graph::NodeIndex, который является другой структурой.

ОМГ, какая глупая ошибка. Заявление об использовании было фактически автоматически вставлено VS Code / Rust Analyzer.... Большое спасибо.

Udo Eisenbarth 25.11.2022 13:29

Другие вопросы по теме