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

Rust 借用检查器如何处理从函数返回的引用?,rust,Rust,我对Rust还不熟悉,我正在阅读Rust编程语言在线书籍。我现在遇到一个关于Rust的借阅检查的问题,代码示例如下所示: fn第一个单词(s:&String)->&str{ 设bytes=s.as_bytes(); 以字节为单位的(i,&b)。iter()枚举(){ 如果b==b''{ 返回&s[…i]; } } &s[…] } fn main(){ 让mut s=String::from(“hello world”); 设单词=第一个单词(&s); s、 清除(); println!(“wor

我对Rust还不熟悉,我正在阅读Rust编程语言在线书籍。我现在遇到一个关于Rust的借阅检查的问题,代码示例如下所示:

fn第一个单词(s:&String)->&str{
设bytes=s.as_bytes();
以字节为单位的(i,&b)。iter()枚举(){
如果b==b''{
返回&s[…i];
}
}
&s[…]
}
fn main(){
让mut s=String::from(“hello world”);
设单词=第一个单词(&s);
s、 清除();
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
冲突,因为直到最后一次
println,
word
才超出其范围语句。似乎不知何故,Rust的借阅检查器发现由
第一个单词
函数返回的
word
指的是
s
。它是如何实现的?

当你

fn first_word(s: &String) -> &str {
这真的意味着

fn first_word<'a>(s: &'a String) -> &'a str {
fn第一个单词和一个str{
(见附件)

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


这就是借阅检查器如何推断由
first_word
函数返回的
word
指的是
s

@DenysSéguret:我猜这本书没有更新。这在本书的小节中有详细解释。我建议跳过这一部分,了解生命周期是如何变化的在Rust work中。感谢您的回复。我刚刚尝试修改代码,直接从
first\u word
函数返回字符串文本,然后投诉剧照。看起来借用检查器在您刚才提到的生命周期中做出了决定。我将阅读相关内容,谢谢。@Lancern借用检查器只查看该函数原型(即参数和返回类型)确定输入引用和输出引用之间的关系。更改函数的实现不会改变调用站点对函数的处理方式。为了返回引用,必须将该引用与其中一个输入关联起来。然后,调用方可以负责提供寿命较长的输入足够使用返回的引用。您不能返回任意引用;为了返回与输入无关的内容,您必须返回(拥有的)项而不是引用。