吾本轻狂|一起学Rust编程「6」:变量的声明( 二 )

当然 , 肉眼很容易看出3 > 2是一个恒为真的常量表达式 , 所以a = 1是一定会执行的 , 也就是println! 从程序逻辑上来讲 , 并不会访问未初始化的变量 。 这里仍然不能编译通过是因为目前的rustc(1.45.2)在编译期还没有对这种常量表达式的推导 。
未使用的变量如果你勤恳地编译了前面的一些示例代码 , 你可能已经注意到了 , 有时编译器会产生类似这样的警告:
warning: variable `a` is assigned to, but never used --> var.rs:2:9|2 |let a;|^|= note: `#[warn(unused_variables)]` on by default= note: consider using `_a` instead这是因为我们的变量在声明或者赋值以后 , 完全没有使用它的值 。 Rust希望通过这样的警告来避免无用代码 , 以保持程序整洁和可读 。
有时出于语法需要 , 定义一些不被使用的变量是不可避免的 。 这些情况下 , 可以像警告里提示的那样 , 用一个简单的下划线_ , 或者一个以下划线_开头的变量名来告诉编译器“我知道这个变量的值确实不需要被用到 , 不用再警告我了” 。
例如 , 这个写法可以用在for循环中:
fn main() {for _ in 1..10 {println!("hi there!");}}或者用在match的模式匹配中:
fn main() {let a = (0, 1, 2);let b = match a {(0, _y, z) => z,(1, y, _z) => y,(x, _y, _z) => x,};println!("b is {}", b);}变量可变性:mut的使用到现在为止 , 我们对变量只做过声明和初始化 。 如果你试着在初始化以后对变量的值进行修改 , 可能会得到下面的编译错误:
error[E0384]: cannot assign twice to immutable variable `a` --> var.rs:3:5|2 |let a = 1;|-|||first assignment to `a`|help: make this binding mutable: `mut a`3 |a = 2;|^^^^^ cannot assign twice to immutable variableerror: aborting due to previous error; 1 warning emittedFor more information about this error, try `rustc --explain E0384`.这是因为Rust跟很多其他的语言相反 , 用let声明的变量默认是“只读”的 , 也就是一旦赋予了初始值 , 就不能再进行改变 。
这个设计的意图很明显 , 就是鼓励开发者尽可能地使用只读变量 。 这样做的好处也显而易见:一方面可以避免错误地对一个不该被修改的变量赋值引入bug , 另一方面在阅读代码时 , 一个只读的数据比一个可能会改变的数据更容易把握 。
为了声明一个货真价实的变量 , 我们需要用到mut关键字 。 把let改成let mut即可:
fn main() {let mut a = 1;println!("a is {}", a);a = 2;println!("a is {}", a);}变量可以看作是一个值(或者说一段数据)的“代号” 。 数据才是实实在在存在于计算机里的 , CPU做运算真正访问的东西 。 而是否有mut , 并不改变变量的这一本质属性 , 它只决定了在语法层面 , 能否通过这一变量来修改其背后的数据 。
这里需要注意 , 不可修改的变量跟我们通常理解的常量是不一样的 。 Rust里的常量是一个“字面上的值” , 需要用const关键字来定义 , 并且必须指定类型:
const PI :f32 = 3.1416;fn main() {let r = 3f32;println!("Perimeter of a circle with radius of {} is {}",r, r * 2.0 * PI);}换句话说 , 常量也可以看作一种代码字面(lexical)的“替换” , 上面的代码可以等价于:
fn main() {let r = 3f32;println!("Perimeter of a circle with radius of {} is {}",r, r * 2.0 * 3.1416f32);}最后我们照例用一个例子来结束今天的学习 。
fn gcd(a :u32, b: u32) -> u32 {let max = |u, v| if u > v { u } else { v };let min = |u, v| if u


推荐阅读