< 返回版块

gxc8036 发表于 2021-06-02 09:44

Tags:rust

let mut s1 = "10";

let s2 = &mut s1;

*s2 = "0";

println!("addr:{:p}", s1);

println!("addr:{:p}", *s2);


cannot borrow s1 as immutable because it is also borrowed as mutable --> src/gus/test/t1.rs:57:27 | 53 | let s2 = &mut s1; | ------- mutable borrow occurs here ... 57 | println!("addr:{:p}", s1); | ^^ immutable borrow occurs here 58 | 59 | println!("addr:{:p}", *s2); | --- mutable borrow later used here

最后两行打印语句顺序互换,没问题,这是所有权里面的什么原则???

评论区

写评论
作者 gxc8036 2021-06-02 13:04

醍醐灌顶!

苦瓜小仔 2021-06-02 11:16

但凡仔细看过:https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html

都不会问这个问题。

fn main() {
    let mut s1 = "10";

    let s2 = &mut s1;

    *s2 = "0";

    println!("addr:{:p}", s1); // s1 这里是不变引用
    println!("addr:{:p}", *s2); // s1 可变引用也存在,违反所有权规则
}

fn main() {
    let mut s1 = "10";

    let s2 = &mut s1;

    *s2 = "0";

    println!("addr:{:p}", *s2);
   // `s2` 在此处之后不再被使用,其作用域终止(因为引用具有生命周期),s1 此时没有可变引用了

    println!("addr:{:p}", s1); // 此处 s1 实际上是仅有的(不变)引用,所以不违背所有权规则
}
1 共 2 条评论, 1 页