变量的可变性

在所有的编程语言中,变量都是一个必备的概念;否则,计算机也就失去了意义。但是对于变量的值是否可以修改,却存在着不同的设计理念。我见过的有如下三种类型:
一、变量随时可变
变量,顾名思义,就是可以改变的量。在大多数的语言中,我们可以随时给一个变量赋值,从而改变其内容。如C, C++, C#, Java, Go等。
这种方式的好处显而易见,即可以很容易地操作变量,从而实现功能需求。
但这种灵活性也带来了一些隐患,即变量可能被无意中修改而不自知,从而引入了bug。

int x = 5;
x = 6;

二、变量不可变
为了解决前述的问题,有些语言,如Erlang规定变量一旦被赋值,则不能改变。如果想要改变,就需要一个定义一个新的变量。
这种方式的好处是,不会在无意中修改变量的值。
但是它带来的问题却更大:
1、由于变量不可以修改,当我们需要修改数据时,需要先拷贝原始数据到新的内存地址,尤其是当拷贝的为大对象时,性能损失极大;
2、由于变量不可以修改,每次要修改时,我们需要给变量一个新的名称,这对于命名是一个极大的挑战。本来需要一个有意义的名称已经很不容易了,现在却需要找多个名称;于是在代码里面出现了大量的Name1, Name2, Name3这样的变量名称,非常的丑陋。
错误的写法:

X = 5,
X = 6. // exception error: no match of right hand side value 6

正确的写法:

X = 5,
X1 = X + 1,

三、变量默认不可变,但可以按需改变
为了解决前述问题,新锐语言,如Rust采取了一套新的方式。
1、变量默认是不可以被修改的;
2、但如果确实需要被修改,则在定义变量时,在变量名前面加上mut关键字;
3、同一个变量名可以重复使用。这样可以在修改变量后,再将其变为不可变。
错误的写法:

let x = 5;
x = x + 1; // cannot assign twice to immutable variable

正确的写法:

let mut x = 5;
x = x + 1;

高级的写法:

let mut x = 5;
x = x + 1;
let x = x; // 之后x将不可以被修改

Rust的这种方式,可以很方便地帮助程序员控制变量的可变性,并减少隐秘bug的引入。

你可能感兴趣的:(变量的可变性)