小编Aus*_*ile的帖子

何时取消引用或不取消引用

我正在浏览“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)

pointers reference dereference rust

16
推荐指数
1
解决办法
4367
查看次数

多个不可变引用

我有以下代码:

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 哈希图进行了两个可变引用,但是对于不管什么原因,代码编译得很好。这是为什么?

reference immutability rust borrow-checker

2
推荐指数
1
解决办法
418
查看次数