You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中为何`y = x`会转移所有权,而`y = &*x`不会?

Rust中为何y = x会转移所有权,而y = &*x不会?

哈哈,这个问题我刚入门Rust的时候也卡了好一会儿,咱们用大白话掰扯明白!

先看你第一个编译失败的代码:

fn main() {
    let x = Box::new(1);
    let y = x;
    println!("{}", x);
}

这里的let y = x,对于Box<i32>这种拥有所有权的类型,Rust的默认赋值逻辑就是「转移所有权」——就像你手里攥着一个装着1的小盒子,直接把整个盒子塞给了y,自己手里空落落的,自然没法再用x去做任何操作了。Rust这么干就是为了从根源上避免双重释放、悬垂指针这些C/C++里的经典坑。

再看第二个能正常运行的代码:

fn main() {
    let x = Box::new(1);
    let y = &*x;
    println!("{}", x);
}

这里的&*x得拆成两步看:

  • 第一步*x:这是对Box做解引用,相当于打开盒子,露出里面的那个1;
  • 第二步&:对这个露出来的1取引用,也就是创建一个共享的查看权限——就像你把自己的书打开,给朋友递过去让他翻两页,你自己还是书的主人,完全不影响你之后继续用这本书(对应代码里的println!("{}", x))。

关键在于,&*x只是从x那里借了一个“访问权”,根本没碰x的所有权。Rust的借用规则允许同时存在多个这种共享引用,只要没人去修改数据就行,所以编译器完全不会拦着你继续用x。

顺便提一嘴,其实你把&*x写成&x也能正常编译,因为Rust的自动解引用特性会帮你自动处理这一步,但显式写&*x能更清楚地看到背后的逻辑~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:59:35