我是 Rust 新手。我正在从官方 rust-lang 网站上的“The Rust 编程语言”一书中学习 Rust。在“理解所有权”一章的切片类型部分中有一个代码可以从字符串中查找第一个单词。代码如下。
fn main() {
let mut greeting = String::from("Hello, Rust!");
let word = first_word(&greeting);
greeting.clear();
println!("{}", word);
}
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[0..i];
}
}
&s[..]
}
我收到以下编译器错误。
error[E0502]: cannot borrow `greeting` as mutable because it is also borrowed as immutable
--> src/main.rs:5:5
|
3 | let word = first_word(&greeting);
| --------- immutable borrow occurs here
4 |
5 | greeting.clear();
| ^^^^^^^^^^^^^^^^ mutable borrow occurs here
6 | println!("{}", word);
| ---- immutable borrow later used here
这里的问题是关于
first_word
函数具有的不可变借用。我不明白的是,任何函数在超出范围时都应该删除它所拥有的所有引用。那么为什么 greeting
的不可变借用仍然在范围内呢?它应该在第三行之后被删除。
我想我在
first_word
函数中做错了什么,因此不可变借用不会被删除。我真的不知道在这里做什么。
如果有人能对此做出解释,我将不胜感激。谢谢!
这里的问题是我有点误解了引用的概念。我假设
first_word
函数返回的字符串切片是与实际字符串不同的对象,因此它不会被视为对实际字符串的引用。但切片类型本身具有对实际字符串对象的引用,因此 word
变量间接具有对实际字符串的引用。因此,该字符串仍然被认为是借用的。
这是我对这个概念的误解。抱歉给您带来麻烦了。