Rust 中的字符串借用和 println 问题

Issue with string borrowing and println in Rust

最近一直在学习rust,有什么想不通

为什么这样做有效

fn main() {
    let mut s = String::from("hello");
    println!("{}", &s);
    let r = &s;
    
    println!("{}", r);
    let x = &mut s;
    println!("{}", x);
    }

但这不是

fn main() {
    let mut s = String::from("hello");
    println!("{}", &s);
    let r = &s;
    let x = &mut s;
    println!("{}", r);
    
    println!("{}", x);
    }

它给出了以下错误:

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

如果 println 取得了字符串的所有权,但 return 没有取得它,为什么第一个片段有效。我们在这两种情况下做的不是一样的吗?

感谢您的建议。

总而言之,&mut s 是排他性借用,即它不允许在同一范围内进行任何其他类型的借用。

第一个代码片段由于 lexical scoping 而起作用,即,编译器足够聪明,可以确定 r&mut s.

之后没有被使用
fn main() {
    let mut s = String::from("hello");
    println!("{}", &s);
    let r = &s;
    
    println!("{}", r);
    let x = &mut s;
    println!("{}", x);
    }

但是,如果我们使用这个片段而不是第一个片段。该代码将给出与再次使用 r 相同的错误 &mut s,这在该语言中是不允许的。

fn main() {
    let mut s = String::from("hello");
    println!("{}", &s);
    let r = &s;
    
    println!("{}", r);
    let x = &mut s;
    println!("{}", x);
    
    println!("{}", r);
    }