Вопрос новичка: я хочу использовать ящик ржавчины 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`
...
Что я здесь делаю неправильно?

Вы импортируете petgraph::adj::NodeIndex , который является псевдонимом для u32, но вам нужно импортировать petgraph::graph::NodeIndex, который является другой структурой.
ОМГ, какая глупая ошибка. Заявление об использовании было фактически автоматически вставлено VS Code / Rust Analyzer.... Большое спасибо.