Rust中的变量、常量和可变性


Rust默认情况下变量是不可变的;注意这里不可变的变量并不是常量,有编程经验的朋友可能会觉得一头雾水,让我们继续往下看;

看一段代码:

fn main() {

    let x = 1; //使用 let 关键字声明变量并赋值
    println!("the value of x is : {}",x);
    x = 6;
    println!("the value of x is : {}",x);

}

这段看似很平常的代码会造成编译错误:error[E0384]: cannot assign twice to immutable variable `x`

rust E0384,cannot assign twice to immutable variable `x`

出现这个错误是以为你试图为一个不可变的变量赋值;

为什么会被设计成这样呢?如果我们代码的一部分假设一个值永远不会改变,而我们代码的另一部分则改变了该值,那么代码的第一部分可能不会按照设计的意图去执行;实际上,这种错误的原因可能很难追查;

变量仅在默认情况下是不可变的,你可以通过在变量名前添加 mut 关键字来使变量可以改变;不仅如此,它还能让你的代码更具有阅读性,mut 是 mutable 的缩写,意为可变的;

修改前面的代码:

fn main() {

    let mut x = 1; //使用 let 关键字声明变量并赋值
    println!("the value of x is : {}",x);
    x = 6;
    println!("the value of x is : {}",x);

}

编译这段代码并执行,将得到以下信息:

the value of x is : 1
the value of x is : 6

变量和常量之间的差异

无法更改的变量可能使你想起其它编程语言都具有的另一个概念:常量;

与不可变的变量一样,常量也是不允许更改的值,但它们之间存在一些差异:

首先,常量不允许使用 mut 关键字;默认情况下,常量是始终不可变的,而变量通过使用mut关键值能使其可以改变;

常量使用 const 关键字声明,而变量使用 let 关键字声明,且常量的值必须指定数据类型,而变量可以推断出其类型;

常量可以在任何范围内声明,包括全局范围;常量只能设置为固定值或常量表达式,在编译时就能计算出其结果;

常量的命名必须使用大写字母或数字和下划线;

const U_X2 :u32 = 100_1000; //在数字中插入下划线可提高可读性

遮蔽

不同于C语言,rust允许你声明一个已经声明过的变量名,并且该新变量会覆盖先前的变量,并且改变其类型,这点上有点像Python;

来看一段代码:

fn main() {
    let x = 5;

    let x = x + 1;

    let x = x * 2;

    println!("The value of x is: {}", x);
}

x 最终的值为 12;

这有点像使用mut关键字,但它们是不同的,如果你尝试不适用let关键字修改x,将产生编译错误;

和mut的另一个区别是,使用let再次声明变量时能改变值的类型:

fn main() {
    let strings = "abcdefg";
    let strings = strings.len(); // .len()获取字符串长度
    println!("{}",strings);
}

第一个strings变量为字符串类型,第二个变量为数字类型;而使用mut关键字声明的变量不允许修改其类型:


    let mut strings = "abcdefg"; 
    strings = strings.len(); 

这段代码将造成编译错误 error[E0308] : mismatched types,该错误表明类型不匹配。


转载声明
本文版权归作者所有

如需转载,请注明出处;本文地址: https://www.perfcode.com/p/rust-variables-constants-and-mutability.html