我正在阅读 the official Rust Book 并查看第 4.3 节中的 list 4-8。

代码如下所示:

fn first_word(s: &String) -> usize {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return i;
        }
    }

    s.len()
}

fn main() {
    let mut s = String::from("hello world");

    let word = first_word(&s);

    s.clear();
}

这一行:

let word = first_word(&s);

似乎借用了对 s 的不可变引用。 (这就是我想我错的地方;我只是不知道为什么。)

在下一行中,我们通过调用 s 方法来改变 clear()

我期待编译器抛出:
cannot borrow `s` as mutable because it is also borrowed as immutable

为什么要编译?

最佳答案

在对 s 的调用期间,字符串 first_word 被永久地借用。一旦在 main 之后将控制权返回给 first_word ,该字符串就不再被视为借用的,并且可以按照您的观察进行变异。

如果 first_word 返回一个 &String,你通过将它分配给一个变量来延长它的生命周期,那么你会看到你期望的错误。例如。

fn first_word(s: &String) -> &String {
    &s
}

fn main() {
    let mut s = String::from("hello world");
    let word = first_word(&s);
    s.clear();
}



https://rust.godbolt.org/z/cMVdVf

在这种情况下,添加一个额外的范围可以解决这个问题:
fn main() {
    let mut s = String::from("hello world");

    {
        let word = first_word(&s);
    }

    s.clear();
}

关于rust - 为什么这不算作不可变借用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55816067/

10-11 17:28