我有一系列國家,我想生成這些國家之間的關係,以便國家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