Rust从0到1-基础概念-变量
变量默认为不可变
不同于目前主流的语言,Rust变量默认是不可改变的,类似Java中声明为final的变量,当然你也可以通过增加
fn main() {
let word = "hello";
println!("The value of word is: {}", word);
word = "bye";
println!("The value of word is: {}", word);
}
除了安全性因素考虑之外,还有其它的一些考虑因素,譬如性能因素,这个就需要权衡了,在数据结构比较大的情况下,如果需要进行修改,就需要创建新的实例,也就是需要复制并分配新的存储空间,带来的性能影响可能就会比较大,这时候我们就需要考虑是否需要为了更好的性能而使用可变变量。譬如,Spring 的Bean默认就是单例的,避免了反复创建新的实例,但是在多线程环境下使用的时候就要特别注意,如果处理逻辑中有对单例状态的修改,则需要考虑线程同步问题。
和常量的区别
我认为概念上的主要区别在于,一般常量我们用于需要多次使用到的固定值,这样以后如果需要修改,我们只需要在一个地方进行维护。它是一个事先确定的值,不能用于方法或函数的返回值,即不能在运行时获得。其它的诸如必须要声明类型、不能声明为可变等,我认为主要是语法的区别。
影子特性
这个是Rust语法的一个特点,我理解为可以重复声明同一个名称的变量,后面声明的变量会覆盖前面的变量,分配的内存地址也不同。甚至后面的变量的类型也可以不同,这个与
let spaces = " ";
let spaces = spaces.len();
println!("The value of spaces is: {}", spaces);
let mut spaces = " ";
spaces = spaces.len();
println!("The value of spaces is: {}", spaces);
留个思考,如果开始声明是可变变量,后面声明为不可变变量会怎样?反过来又怎样?下面的例子又会怎样?
let v = Vec::new();
let mut v = v;
v.push("hi");
let mut v = Vec::new();
let v = v;v.push("hi");