rust - 借用检查器如何处理从函数返回的引用?

标签 rust

<分区>

我是 Rust 的新手,我正在阅读 The Rust Programming Language 在线书籍。我现在卡在一个关于Rust的借用检查的问题上,代码示例如下:

fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();
    for (i, &b) in bytes.iter().enumerate() {
        if b == b' ' {
            return &s[..i];
        }
    }

    &s[..]
}

fn main() {
    let mut s = String::from("hello world");

    let word = first_word(&s);
    s.clear();

    println!("word = {}", word);
}

Rust 编译器用以下错误消息提示代码:

error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable
  --> src/main.rs:16:5
   |
15 |     let word = first_word(&s);
   |                           -- immutable borrow occurs here
16 |     s.clear();
   |     ^^^^^^^^^ mutable borrow occurs here
17 | 
18 |     println!("word = {}", word);
   |                           ---- immutable borrow later used here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0502`.
error: Could not compile `demo`.

To learn more, run the command again with --verbose.

在线书籍解释说,当执行s.clear()时,会创建一个新的s的可变引用,并与现有的不可变引用word<发生冲突 因为 word 直到最后一个 println! 语句才超出其范围。似乎不知何故,Rust 的借用检查器发现 first_word 函数返回的 word 引用了 s。它是如何实现的?

最佳答案

当你有

fn first_word(s: &String) -> &str {

这是真的

fn first_word<'a>(s: &'a String) -> &'a str {

(参见 lifetime elision)。

也就是说,输出的生命周期是输入的生命周期之一。

这就是借用检查器如何推断 first_word 函数返回的 word 引用 s

关于rust - 借用检查器如何处理从函数返回的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57204201/

相关文章:

rust - Rust 是否删除泛型类型?

rust - 如何解决无法借用可变的问题,因为它位于 `&` 引用后面

html - 是否有 html5ever 的替代库接受一个字符串并返回一个可查询的对象?

尝试从表中获取总计数时, rust 柴油面临错误

multithreading - 如何防止线程在视觉上混淆彼此的输出?

process - 无法通过管道多次传入或传出生成的子进程

rust - 为什么传递给 map() 的闭包不带引用,而传递给 filter() 的闭包带引用?

rust - 为什么 iter() 需要 & 对于 lambda 函数,而 range 在这个例子中不需要

types - 使用 where 子句 : Implementing a simple where clause 的特征实现

macros - 错误 : variable 'x' is still repeating at this depth