我正在阅读Rust官方手册并查看第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
的不可变引用。(这就是我猜错的地方,我只是不知道为什么。)
在下一行中,我们通过调用 clear()
方法来改变 s
。
我原本期望编译器会报错:
cannot borrow `s` as mutable because it is also borrowed as immutable
为什么这个可以编译?
-> String&
代码原理相同。借用在“first_word”作用域之外仍然存在,这意味着我们返回到“main”后,“s”仍然被借用。 - Vittorio Romeo