我有一个Vec
可选的HashSet
。如果插槽是None
,我想分配一个HashSet
并将其存储在Vec
中。在两种情况下,我都想添加到HashSet
。
我了解编译器错误在抱怨什么,但没有哪种语法会使问题消失。编译器建议的更改以及我尝试的任何其他语法也都不会编译。如何匹配Vec
单元格,检查它是否为None
,如果它为Some<HashSet>
,则分配一个None
,或者如果它确实存在,则仅访问HashSet
,并且在两种情况下都将一个新的整数添加到设置?
代码:
use std::collections::HashSet;
use std::collections::BTreeSet;
use std::iter::FromIterator;
use maplit;
pub struct Graph {
outgoing_edges : Vec<Option<HashSet<usize>>>,
incoming_edges : Vec<Option<HashSet<usize>>>
}
impl Graph {
pub fn new(node_count : usize) -> Self {
Graph {
outgoing_edges : vec!(None; node_count),
incoming_edges : vec!(None; node_count)
}
}
/// Add a directional edge that starts at `from_node` and points to `to_node`.
pub fn add_edge(&mut self, from_node : usize, to_node : usize) {
match &self.outgoing_edges[from_node] {
Some(mut set) => { set.insert(to_node); () },
None => { self.outgoing_edges[from_node] = Some(hashset!{ to_node }); () }
}
match &self.incoming_edges[to_node] {
Some(mut set) => { set.insert(from_node); () },
None => { self.incoming_edges[to_node] = Some(hashset!{ from_node }); () }
}
}
}
错误:
((行号来自我的原始文件,而不是短代码段。错误消息来自我添加与号的借用之前,如上所示,但该代码更改无效。)
error[E0507]: cannot move out of index of `std::vec::Vec<std::option::Option<std::collections::HashSet<usize>>>`
--> src\graph\mod.rs:46:15
|
46 | match self.outgoing_edges[from_node] {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider borrowing here: `&self.outgoing_edges[from_node]`
47 | Some(mut set) => { set.insert(to_node); () },
| -------
| |
| data moved here
| move occurs because `set` has type `std::collections::HashSet<usize>`, which does not implement the `Copy` trait
这非常简单,您想通过引用进行绑定:
/// Add a directional edge that starts at `from_node` and points to `to_node`.
pub fn add_edge(&mut self, from_node : usize, to_node : usize) {
match self.outgoing_edges[from_node] {
Some(ref mut set) => { set.insert(to_node); },
None => { self.outgoing_edges[from_node] = Some(hashset!{ to_node }); }
}
match self.incoming_edges[to_node] {
Some(ref mut set) => { set.insert(from_node); },
None => { self.incoming_edges[to_node] = Some(hashset!{ from_node }); }
}
}