变量
重要知识
- 变量:variable,不多解释,和所有语言的定义一致
- 变量绑定:variable bindings,可以先理解为“赋值”,但不完全是这样的
- 遮蔽:bind shadow
- 解构:是啥?后面再学习一下
变量命名
参考《Rust 语言圣经》
变量绑定
前面了解到 Rust 用 let 声明变量,let a = 9;
,这个过程就叫做”变量绑定“,为什么是绑定,而不是常规理解的赋值,这里先总结这两个原则,跟所有权有关:
-
Rust 中每一个值都有且只有一个所有者(变量)
-
当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
这个还要结合所有权再去理解一下
这里简单理解为:绑定即是主从的关系,一个对象(值),绑定到它的主人(变量),代表着一种权属关系,即变量拥有值的所有权。
变量可变性
#![allow(unused)] fn main() { fn mutable() { let a = 5; // a = 6; // 报错:Cannot assign twice to immutable variable [E0384] let mut b = 5; b - 6; } }
通过 mut
声明变量的可变性,显示标记了哪些变量是可变的。
关于显示用 mut 声明变量的可变性,我认为有点设计上的矛盾,或者说不一致,前面可以看到对于类型 Rust 可以自动推导,不用显示声明,这里可变性是需要显示的声明,我的理解“变量的可变性”还是与安全关系紧密相关。
从代码阅读上看,类型推导对阅读和review 不友好,特别是离开 IDE 环境。
变量解构
fn destructure() { let (a, mut b): (bool, bool) = (true, false); println!("a={},b={}", a, b); b = true; println!("a={},b={}", a, b); assert_eq!(a, b) } fn main() { destructure(); }
关于解构模式匹配(pattern match)的内容放在后面再学习,看了部分的内容不是很理解.
不可变变量与常量
常量声明使用 const
,必需标注类型,不能使用 let
;不仅默认是不可变,生命周期内都不允许改变;常量命名是全部大写。
#![allow(unused)] fn main() { const MAX_LEVEL: i32 = 4; }