Rust中变量与值,哪个让你又爱又恨?

2026-05-21 22:165阅读0评论服务器VPS
  • 内容介绍
  • 文章标签
  • 相关推荐

你有没有过这样的经历?写代码的时候,突然发现一个变量“消失”了或者一个值“不听话”地被改了?这种事几乎不会发生——主要原因是Rust把“变量与值”的关系管得死死的。但说实话,Rust的这套机制,有时候也让人又爱又恨,胡诌。。

变量和值,到底谁说了算?

提到这个... 在Rust中,变量和值的关系就像是一场“所有权”的争夺战。变量是值的“主人”,而值是变量的“财产”。一旦你把值的所有权给了别人,你就再也不能碰它了。这听起来很“霸道”,但确实有效。

66个让你对Rust又爱又恨的场景之一:变量与值

比如:

let x = 5;
let y = x; // x的所有权被“移动”给了y
println!; // ❌ 编译错误!x已经“死”了

栓Q! 是不是很绝?你刚想用x,后来啊它已经“不属于你”了。这就是Rust的“所有权”机制,它在编译阶段就帮你把内存平安问题扼杀在摇篮里。但说实话,这种“霸道”有时候也让人抓狂。

栈上值 vs 堆上值:谁更“听话”?

在Rust中,值可以存在两个地方:栈上和堆上。栈上值是“临时工”,用完就走;堆上值是“长期住户”,得自己动手释放,太坑了。。

栈上值, 比如:

let x = 5;
let y = x; // x的值被复制了不是“移动”

堆上值,比如:

let s = String::from;
let s2 = s; // s的所有权被“移动”了s就不能用了

是不是觉得有点“双标”?栈上值可以随便复制,堆上值却要“断舍离”?这就是Rust的“所有权”规则,它不允许你“脚踏两船”,坦白讲...。

智能指针:Rust的“保镖”

切中要害。 在Rust中, 智能指针就像是一群“保镖”,帮你管理那些“不听话”的值。比如Rc ArcRefCell它们各司其职,帮你搞定各种“值”的问题。

比如Rc 就是“共享所有权”的代表:

use std::rc::Rc;
let a = Rc::new;
let b = Rc::clone; // 共享所有权

Arc则是“多线程”版本的Rc

use std::sync::Arc;
let a = Arc::new;
let b = Arc::clone; // 多线程平安

客观地说... 还有RefCell它是个“叛逆者”——在运行时检查借用规则:

use std::cell::RefCell;
let x = RefCell::new;
*x.borrow_mut = 6; // 可变借用

这些智能指针,简直就是Rust的“工具箱”,帮你搞定各种“值”的问题。但说实话,它们有时候也让人头大,特别是当你搞不清哪个该用哪个的时候。

变量的“六亲不认”

我不敢苟同... Rust的变量有六个“方面”:所有权、 作用域、生存期、丢弃、复制、所有权移动。每个方面都有一套“规则”,一旦你违反了Rust就会“翻脸”。

比如你不能这样:

let x = 5;
let y = x; // x的所有权被“移动”了
println!; // ❌ 编译错误!x已经“死”了

也不能这样:

let mut x = 5;
let y = &x
x = 10; // ❌ 可变借用和不可变借用“打架”了

是不是觉得Rust“六亲不认”?它确实不讲情面但这种“无情”也让你的代码更平安。

智能指针排行榜

下面这张表, 列出了Rust中常用的智能指针,以及它们的“特长”:,抓到重点了。

智能指针 用途 线程平安
Box 堆分配
Rc 引用计数
Arc 原子引用计数
RefCell 运行时借用检查
Mutex 互斥锁
RwLock 读写锁

Rust的“爱恨交织”

Rust的变量与值,就像是一对“相爱相杀”的恋人。你爱它的严谨,也恨它的“不近人情”。但正是这种“不近人情”,才让Rust在内存平安上做到了极致,踩个点。。

所以别再抱怨Rust“难学”了它只是在用“铁腕”保护你。

你有没有过这样的经历?写代码的时候,突然发现一个变量“消失”了或者一个值“不听话”地被改了?这种事几乎不会发生——主要原因是Rust把“变量与值”的关系管得死死的。但说实话,Rust的这套机制,有时候也让人又爱又恨,胡诌。。

变量和值,到底谁说了算?

提到这个... 在Rust中,变量和值的关系就像是一场“所有权”的争夺战。变量是值的“主人”,而值是变量的“财产”。一旦你把值的所有权给了别人,你就再也不能碰它了。这听起来很“霸道”,但确实有效。

66个让你对Rust又爱又恨的场景之一:变量与值

比如:

let x = 5;
let y = x; // x的所有权被“移动”给了y
println!; // ❌ 编译错误!x已经“死”了

栓Q! 是不是很绝?你刚想用x,后来啊它已经“不属于你”了。这就是Rust的“所有权”机制,它在编译阶段就帮你把内存平安问题扼杀在摇篮里。但说实话,这种“霸道”有时候也让人抓狂。

栈上值 vs 堆上值:谁更“听话”?

在Rust中,值可以存在两个地方:栈上和堆上。栈上值是“临时工”,用完就走;堆上值是“长期住户”,得自己动手释放,太坑了。。

栈上值, 比如:

let x = 5;
let y = x; // x的值被复制了不是“移动”

堆上值,比如:

let s = String::from;
let s2 = s; // s的所有权被“移动”了s就不能用了

是不是觉得有点“双标”?栈上值可以随便复制,堆上值却要“断舍离”?这就是Rust的“所有权”规则,它不允许你“脚踏两船”,坦白讲...。

智能指针:Rust的“保镖”

切中要害。 在Rust中, 智能指针就像是一群“保镖”,帮你管理那些“不听话”的值。比如Rc ArcRefCell它们各司其职,帮你搞定各种“值”的问题。

比如Rc 就是“共享所有权”的代表:

use std::rc::Rc;
let a = Rc::new;
let b = Rc::clone; // 共享所有权

Arc则是“多线程”版本的Rc

use std::sync::Arc;
let a = Arc::new;
let b = Arc::clone; // 多线程平安

客观地说... 还有RefCell它是个“叛逆者”——在运行时检查借用规则:

use std::cell::RefCell;
let x = RefCell::new;
*x.borrow_mut = 6; // 可变借用

这些智能指针,简直就是Rust的“工具箱”,帮你搞定各种“值”的问题。但说实话,它们有时候也让人头大,特别是当你搞不清哪个该用哪个的时候。

变量的“六亲不认”

我不敢苟同... Rust的变量有六个“方面”:所有权、 作用域、生存期、丢弃、复制、所有权移动。每个方面都有一套“规则”,一旦你违反了Rust就会“翻脸”。

比如你不能这样:

let x = 5;
let y = x; // x的所有权被“移动”了
println!; // ❌ 编译错误!x已经“死”了

也不能这样:

let mut x = 5;
let y = &x
x = 10; // ❌ 可变借用和不可变借用“打架”了

是不是觉得Rust“六亲不认”?它确实不讲情面但这种“无情”也让你的代码更平安。

智能指针排行榜

下面这张表, 列出了Rust中常用的智能指针,以及它们的“特长”:,抓到重点了。

智能指针 用途 线程平安
Box 堆分配
Rc 引用计数
Arc 原子引用计数
RefCell 运行时借用检查
Mutex 互斥锁
RwLock 读写锁

Rust的“爱恨交织”

Rust的变量与值,就像是一对“相爱相杀”的恋人。你爱它的严谨,也恨它的“不近人情”。但正是这种“不近人情”,才让Rust在内存平安上做到了极致,踩个点。。

所以别再抱怨Rust“难学”了它只是在用“铁腕”保护你。