为什么我的函数不删除借用的不可变引用?

问题描述 投票:0回答:1

我是 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
函数中做错了什么,因此不可变借用不会被删除。我真的不知道在这里做什么。

如果有人能对此做出解释,我将不胜感激。谢谢!

rust reference borrow-checker
1个回答
0
投票

这里的问题是我有点误解了引用的概念。我假设

first_word
函数返回的字符串切片是与实际字符串不同的对象,因此它不会被视为对实际字符串的引用。但切片类型本身具有对实际字符串对象的引用,因此
word
变量间接具有对实际字符串的引用。因此,该字符串仍然被认为是借用的。

这是我对这个概念的误解。抱歉给您带来麻烦了。

© www.soinside.com 2019 - 2024. All rights reserved.