gpt4 book ai didi

rust - 为什么这不能算作不可变借用?

转载 作者:行者123 更新时间:2023-11-29 07:57:58 25 4
gpt4 key购买 nike

我正在阅读 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 的不可变引用。 (这是我想我错的地方;我只是不知道为什么。)

在下一行中,我们通过调用 clear() 方法来改变 s

我期待编译器抛出:

cannot borrow `s` as mutable because it is also borrowed as immutable

为什么会这样编译?

最佳答案

字符串 s 在调用 first_word 期间被不变地借用。一旦控制权在 first_word 之后返回到 main,该字符串就不再被认为是借用的,并且可以像您观察到的那样发生变异。


如果 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();
}

cannot borrow s as mutable because it is also borrowed as immutable

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com