我有一系列国家,我想生成这些国家之间的关系,以便国家A和国家B之间的关系总是与国家B和国家A之间的关系相同。如何将两个变量之间的双向关系存储为第三个变量?
例如,日本和厄瓜多尔的关系值为15.我希望能够同时运行get_relationship("Japan", "Ecuador");
和get_relationship("Ecuador", "Japan");
并始终得到15
。理想情况下,我不想将这个值存储两次,因为我不想让它保持同步。
下面是我目前的实验代码。请注意,由于无关联的原因,我将国家/地区作为HashMap
存储为(name as String, Nation as struct)
,主要是我可以通过名称来提取所需的Nation
对象。
extern crate rand;
use std::collections::HashMap;
use rand::Rng;
struct Nation;
pub struct NationManager {
nations: HashMap<String, Nation>, // The string is the nation's name
rels: HashMap<String, HashMap<String, i8>>, // Again, both Strings are names
}
impl NationManager {
fn generate_relationships(&mut self) {
let mut random_rel: i8 = rand::thread_rng().gen_range(1, 101);
for (source, _) in &self.nations {
for (target, _) in &self.nations {
if source > target {
self.rels
.get(source)
.expect("ERROR")
.insert(target.clone(), random_rel);
} else if source < target {
self.rels
.get(target)
.expect("ERROR")
.insert(source.clone(), random_rel);
} else {
continue;
}
}
}
}
}
fn main() {}
我不认为这是达到所需结果的最佳方法,而且目前还不能编译;实际上是否可以像这样嵌套两个for
循环?
error: cannot borrow immutable borrowed content as mutable
--> src/main.rs:19:21
|
19 | self.rels
| _____________________^ starting here...
20 | | .get(source)
21 | | .expect("ERROR")
| |________________________________________^ ...ending here: cannot borrow as mutable
error: cannot borrow immutable borrowed content as mutable
--> src/main.rs:24:21
|
24 | self.rels
| _____________________^ starting here...
25 | | .get(target)
26 | | .expect("ERROR")
| |________________________________________^ ...ending here: cannot borrow as mutable
一个不相关的注释:而不是'。expect(“ERROR”),你可以使用'.unwrap()',这在眼睛上更容易。 'expect()'的意思是提供一个有意义的错误信息。 – user4815162342
编译器提供的实际错误信息是什么? “不归因于所有权欺诈”不是很有用。 –
@ user4815162342我重申,“当前的实验代码”。 @ E_net4“不能借用可变”,指向'self.rels.get(target).expect(“ERROR”)'。 我很希望有人会有更好的解决方案。我无法想象这就是我要实现这一任务的原因。 – Quintus