多个不可变引用
Multiple Immutable References
我有以下代码:
use std::collections::HashMap;
fn doublez(h1: &HashMap<String, i32>, h2: &HashMap<String, i32>) {
dbg!(h1, h2);
}
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let teams = vec![
String::from("Blue"),
String::from("Yellow"),
];
let initial_scores = vec![10, 50];
let team_scores: HashMap<_, _> = teams.into_iter().zip(initial_scores.into_iter()).collect();
let mut ts2 = &team_scores;
let mut ts3 = &team_scores;
doublez(ts2, ts3);
}
我正在试验 Rusts 所有权规则,我正在测试你不能有多个可变引用的整个想法,但在这段代码中,我对 team_scores 哈希映射进行了两个可变引用以 ts2 和 ts3 的形式,但无论出于何种原因,代码都可以正常编译。这是为什么?
let mut ts2 = &team_scores
实际上并不是在创建一个可变引用,而是一个包含不可变引用的可变变量。这意味着您可以将变量重新分配给另一个引用(即 ts2 = &different_hashmap
),但您将无法修改 HashMap 本身(即尝试调用 ts2.insert
将不起作用)。
如果你想要一个对 HashMap 的可变引用,你可以使用 let ts2 = &mut team_scores;
.
我有以下代码:
use std::collections::HashMap;
fn doublez(h1: &HashMap<String, i32>, h2: &HashMap<String, i32>) {
dbg!(h1, h2);
}
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let teams = vec![
String::from("Blue"),
String::from("Yellow"),
];
let initial_scores = vec![10, 50];
let team_scores: HashMap<_, _> = teams.into_iter().zip(initial_scores.into_iter()).collect();
let mut ts2 = &team_scores;
let mut ts3 = &team_scores;
doublez(ts2, ts3);
}
我正在试验 Rusts 所有权规则,我正在测试你不能有多个可变引用的整个想法,但在这段代码中,我对 team_scores 哈希映射进行了两个可变引用以 ts2 和 ts3 的形式,但无论出于何种原因,代码都可以正常编译。这是为什么?
let mut ts2 = &team_scores
实际上并不是在创建一个可变引用,而是一个包含不可变引用的可变变量。这意味着您可以将变量重新分配给另一个引用(即 ts2 = &different_hashmap
),但您将无法修改 HashMap 本身(即尝试调用 ts2.insert
将不起作用)。
如果你想要一个对 HashMap 的可变引用,你可以使用 let ts2 = &mut team_scores;
.