为什么这不算作一成不变的借贷?

时间:2019-04-23 16:57:33

标签: rust

我正在阅读the official Rust Book,并查看第4.3节中的清单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

为什么要编译?

1 个答案:

答案 0 :(得分:5)

在调用sheet_range的过程中,字符串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

在这种情况下,添加一个额外的范围将解决此问题:

s