首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我可以在不使用不安全代码的情况下获得对Rust中变量的多个可变引用?

为什么我可以在不使用不安全代码的情况下获得对Rust中变量的多个可变引用?
EN

Stack Overflow用户
提问于 2021-04-06 19:04:32
回答 1查看 439关注 0票数 2

我正在读“锈书”,书上写着:第4.2节

在任何给定的时间,您可以有一个可变引用或任意数量的不可变引用。

然而,我在实验中发现,实际上我可以在同一范围内拥有多个可更改的引用,而无需使用任何不安全的代码:

代码语言:javascript
复制
fn make_mut(x: &mut i32) -> &mut i32 {
    x
}

fn main() {
    let mut i = 1;
    let ir = &mut i;
    let ir2 = make_mut(ir);
    *ir2 = 2;
    println!("{}", *ir);
}

输出:

代码语言:javascript
复制
2

这里发生了什么事?“锈书”是不是过于简单化了?对于没有经验的锈蚀程序员来说,是否有比锈蚀书更好的信息来源?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-06 19:06:53

可变的引用是非Copy的,所以在将ir传递给make_mut之后,它被移动了,不再存在了:

代码语言:javascript
复制
fn make_mut(x: &mut i32) -> &mut i32 {
    x
}

fn main() {
    let mut i = 1;
    let ir = &mut i;
    let ir2 = make_mut(ir);
    *ir = 3; // error here
    *ir2 = 2;
    println!("{}", *ir);
}

在您的特殊情况下,ir会重新借款;这就是Rust修改代码的方式:

代码语言:javascript
复制
fn make_mut(x: &mut i32) -> &mut i32 {
    x
}

fn main() {
    let mut i = 1;
    let ir = &mut i;
    let ir2 = make_mut(&mut *ir); // rust replaces raw `ir` with reborrowed mutable reference to dereferenced `ir`
    *ir2 = 2;
    println!("{}", *ir);
}

如果尝试同时使用这两个可变引用,仍然会出现编译错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66974963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档