我正在阅读官方生锈书,并查看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
这为什么要编译呢?
发布于 2019-04-23 17:02:44
在调用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();
}
不能以可变的形式借用
s
,因为它也是不可变的。
https://rust.godbolt.org/z/cMVdVf
在这种情况下,添加一个额外的作用域可以解决这个问题:
fn main() {
let mut s = String::from("hello world");
{
let word = first_word(&s);
}
s.clear();
}
https://stackoverflow.com/questions/55816067
复制相似问题