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
相关产品推荐
相关产品推荐

