我正在阅读 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/