我正在阅读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
为什么要编译?
答案 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