当前位置: 首页 > news >正文

Rust位置表达式和值表达式

Rust 里把表达式分为两类:

位置表达式 (place expression) —— 表示一个内存位置,可以作为赋值语句的左值。

值表达式 (value expression) —— 表示一个具体的值,只能作为右值。


1. 本地变量 (Local Variables)

本地变量本身就是位置表达式,可以存储和修改值。

fn main() {let mut x = 10; // x 是位置表达式x = 20;         // 可以赋值,因为 x 是一个内存位置println!("{}", x);
}

2. 静态变量 (Static Variables)

静态变量有固定的内存位置,所以也是位置表达式。

static mut COUNTER: i32 = 0;fn main() {unsafe {COUNTER = 100;  // 静态变量是位置表达式println!("{}", COUNTER);}
}

3. 解引用 (*expr)

对指针解引用后得到的是一个位置(指向的内存)。


fn main() {let mut x = 10;let y = &mut x;*y = 20;     // *y 是位置表达式,表示 x 的位置println!("{}", x);
}

4. 数组索引 (expr[expr])

数组或切片的索引表达式是位置表达式。

fn main() {let mut arr = [1, 2, 3];arr[0] = 10;  // arr[0] 是位置表达式println!("{:?}", arr);
}

5. 字段引用 (expr.field)

结构体的字段是位置表达式。

struct Point { x: i32, y: i32 }fn main() {let mut p = Point { x: 0, y: 0 };p.x = 10;    // ✅ p.x 是位置表达式println!("({}, {})", p.x, p.y);
}

6. 位置表达式组合

比如 arr[0].field(*ptr).fieldstruct.field[index] 之类的组合,依然是位置表达式。

struct Item { val: i32 }fn main() {let mut arr = [Item { val: 1 }, Item { val: 2 }];arr[1].val = 99;  // ✅ arr[1].val 是位置表达式println!("{}", arr[1].val);
}

注意事项:
值表达式不能出现在位置上下文中

pub fn temp() -> i32 {return 1;}fn main() {let x = &temp();temp() = *x; //错误
}

其中&temp()表示获取temp()返回的临时变量的地址


当位置表达式出现在值上下文中时,该位置表达式将会把内存地址转移给另外一个位置
表达式,这其实是所有权的转移,如

fn main() {let a = "hello";             // a 的类型是 &str,字符串字面量,存储在静态区,不涉及所有权转移let b = "hello".to_string(); // b 的类型是 String,堆上分配内存,拥有所有权let ohter = a;               // &str 可以 Copy,所以 a 依然可用println!("{:?}", ohter);let ohter = b;               // String 没有实现 Copy,赋值时发生 move,b 的所有权转移给 ohterprintln!("{:?}", ohter);// println!("{}",a);          // 正确 a 还能用,因为 a 没有被 move,只是复制了个指针// println!("{}",b);          // 错误,因为 b 的所有权已经被转移走,b 无效
}

文章转载自:

http://AxFYZSbV.xphcg.cn
http://8OOimJEq.xphcg.cn
http://zrazmnCg.xphcg.cn
http://7C0cTiQ1.xphcg.cn
http://gA0PKzSU.xphcg.cn
http://wbK5169Q.xphcg.cn
http://EfLgjaBH.xphcg.cn
http://QjLNIbrj.xphcg.cn
http://00HiKmmV.xphcg.cn
http://wv6S3nDm.xphcg.cn
http://DLup7NKn.xphcg.cn
http://zby6JKMN.xphcg.cn
http://nhReoFYi.xphcg.cn
http://r3KKmde3.xphcg.cn
http://FycsFa7t.xphcg.cn
http://HT0NbjXJ.xphcg.cn
http://v87AgoVR.xphcg.cn
http://JEWIuT3g.xphcg.cn
http://JWE0KWSc.xphcg.cn
http://Uo7Ij6Oc.xphcg.cn
http://39MwiMpx.xphcg.cn
http://SPWQ1YiM.xphcg.cn
http://MKGcxO0H.xphcg.cn
http://YH4uRGOf.xphcg.cn
http://a191wknD.xphcg.cn
http://LjUpKsBG.xphcg.cn
http://KoP4DiZx.xphcg.cn
http://jiu0lUgr.xphcg.cn
http://iOhYmfCm.xphcg.cn
http://JbOCJzaz.xphcg.cn
http://www.dtcms.com/a/374222.html

相关文章:

  • 对比:ClickHouse/MySQL/Apache Doris
  • 2025年学英语学习机选购指南
  • 浪涌测试主要用于评估电子设备或元器件在遭受短时高强度电压 / 电流冲击(浪涌)时的耐受能力
  • ANDROID,Jetpack Compose, 贪吃蛇小游戏Demo
  • html中列表和表格的使用
  • MyBatis-Plus 深度解析:IService 接口全指南
  • iPaaS 如何帮助 CIO 减少 50% 的集成成本?
  • [运动控制]PID算法再深入--多环组合控制
  • llm的一点学习笔记
  • JVM详解(一)--JVM和Java体系结构
  • Java字符串处理:String、StringBuilder与StringBuffer
  • SQL 注入与防御-第十章:确认并从 SQL 注入攻击中恢复
  • MCP(模型上下文协议)入门教程1
  • 已知两个平面点的坐标、切线方向、曲率,构造三阶Bezier曲线的方法
  • STM32添加库函数
  • Python 示例(Tkinter)
  • 学习如何基于ACP-SDK构建多智能体系统
  • Dify 从入门到精通(第 83/100 篇):Dify 的多模态模型性能调优(高级篇)
  • 【docker】镜像制作
  • 前端安全攻防:XSS, CSRF 等防范与检测
  • Unity鱼眼特效
  • MySQL表结构优化:安全删除字段(DROP COLUMN)的完整指南与避坑手册
  • Java全栈技术选型指南
  • Leptos框架深度解析:用Rust构建高性能Web应用的未来
  • 嵌入式学习day45-硬件—汇编
  • Gazebo1: gz命令工具理解与掌握
  • 电路运行的核心-RTC
  • 高并发下的锁选择:乐观锁 vs 悲观锁全面对比
  • 本地部署大模型和知识库实现问答AI
  • python编程:一文掌握pypiserver的详细使用