rust - 关于 Rust 中的借用的困惑

标签 rust borrow-checker ownership ownership-semantics

我有 2 个示例代码。


第一个示例代码

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

    let r1 = &mut s;
    let r2 = & s;

    println!("{}", r2);
}

第二个示例代码

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

    let r1 = &mut s;
    let r2 = & s;

    println!("{}", r1);
}

我困惑的是为什么 1stExampleCode工作正常,但是2ndExampleCode创建编译错误如下

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

据我所知,在两个示例代码中我都借用 r1进行了可变借用 sr2进行了不可变的借用 s 。那么为什么1stExampleCodes 起不再有错误借用为 mutableimmutable同时。或者因为r1未使用,因此不会产生任何错误。

最佳答案

在第一个示例中,编译器足够聪明,知道 r1 在初始化后不再使用,因为它不再被调用。 这也意味着借用的sr1初始化行之后被释放,并且可以被其他人借用。所以r2可以借用它。

在第二个示例中,r1 借用具有可变引用的 s 值。可变引用只能由一个变量借用。 但是 r2 借用了 s 变量,而 r1 仍然在 println! 行中使用它。

欲了解更多信息,您可以阅读此https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html

关于rust - 关于 Rust 中的借用的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71814554/

相关文章:

json - 使用 serde_json 序列化带有非字符串键的映射

generics - 实现拥有和借用的特征

rust - 如果在我插入的数据之后声明引用,则无法在 HashMap 中插入引用

gcc - GCC 的 ASAN 能否提供与 Rust 相同的内存安全性?

rust - 不能作为不可变借用,因为它也作为可变借用

rust - 从 HashMap 或 Vec 返回引用会导致借用超出其所在范围?

c++ - 如何处理指针成员的不同所有权策略?

rust - 在涉及线和 map 的情况下对所有权感到困惑

rust - 用Bevy 0.4拖动 Sprite 可以接受的方法是什么?

reference - 如何从 for 循环中检索用户定义的类型?