我正在浏览“Rust Book”网站,以便学习即将到来的工作面试的语言。在向量章节中,有两个代码示例:
fn main() {
let v = vec![100, 32, 57];
for i in &v {
println!("{}", i);
}
}
Run Code Online (Sandbox Code Playgroud)
和:
fn main() {
let mut v = vec![100, 32, 57];
for i in &mut v {
*i += 50;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道,为什么对于第一个样本,当我们将对向量元素i的引用传递到:
println!("{}", i);
但是在我们向向量的每个元素添加 50 的示例中,在添加到 50 之前,我们必须使用 * 取消引用该元素?
我们为什么不/不能做以下事情:
fn main() {
let v = vec![100, 32, 57];
for i in &v {
println!("{}", *i); // why don't we have to dereference before we …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
我正在试验 Rust 所有权规则,并且正在测试不能拥有多个可变引用的整个想法,但在这段代码中,我以 ts2 和 ts3 的形式对 team_scores 哈希图进行了两个可变引用,但是对于不管什么原因,代码编译得很好。这是为什么?