|
|
|
@ -6,7 +6,7 @@
|
|
|
|
|
|
|
|
|
|
在其它大多数语言中,变量一旦创建,要么是可变的,要么是不可变的(ClojureScript),前者为编程提供了灵活性,后者为编程提供了安全性,而 Rust 比较野,选择了两者我都要,既要灵活性又要安全性。
|
|
|
|
|
|
|
|
|
|
能想要学习 Rust,说明我们的读者都是相当有水平的程序员了,你们应该能理解**一切选择皆是权衡**,那么两者都要的权衡是什么呢?这就是 Rust 开发团队为我们做出的贡献,两者都要意味着 Rust 语言底层代码的实现复杂度大幅提升,因此 Respect to The Rust Team!
|
|
|
|
|
能想要学习 Rust,说明我们的读者都是相当有水平的程序员了,你们应该能理解**一切选择皆是权衡**,那么两者都要的权衡是什么呢?这就是 Rust 开发团队为我们做出的贡献,两者都要意味着 Rust 语言底层代码的实现复杂度大幅提升,因此 Salute to The Rust Team!
|
|
|
|
|
|
|
|
|
|
除了以上两个优点,还有一个很大的优点,那就是运行性能上的提升,因为将本身无需改变的变量声明为不可变在运行期会避免一些多余的 `runtime` 检查。
|
|
|
|
|
|
|
|
|
@ -22,15 +22,15 @@
|
|
|
|
|
|
|
|
|
|
为何不用赋值而用绑定呢(其实你也可以称之为赋值,但是绑定的含义更清晰准确)?这里就涉及 Rust 最核心的原则——**所有权**,简单来讲,任何内存对象都是有主人的,而且一般情况下完全属于它的主人,绑定就是把这个对象绑定给一个变量,让这个变量成为它的主人(聪明的读者应该能猜到,在这种情况下,该对象之前的主人就会丧失对该对象的所有权),像极了我们的现实世界,不是吗?
|
|
|
|
|
|
|
|
|
|
至于为何要采用所有权这种复杂的东东,先别急,等时机合适,我们会为你详细道来。
|
|
|
|
|
那为什么要引进“所有权”这个新的概念呢?请稍安勿躁,时机一旦成熟,我们就回来继续讨论这个话题。
|
|
|
|
|
|
|
|
|
|
## 变量可变性
|
|
|
|
|
|
|
|
|
|
Rust 的变量在默认情况下是**不可变的**。在上文提到过,这是 Rust 团队为我们精心设计的语言特性之一,这样可以让我们编写更安全、更高性能的代码。当然你可以通过 `mut` 关键字让变量变为**可变的**,以实现更加灵活的设计。
|
|
|
|
|
Rust 的变量在默认情况下是**不可变的**。前文提到,这是 Rust 团队为我们精心设计的语言特性之一,让我们编写的代码更安全,性能也更好。当然你可以通过 `mut` 关键字让变量变为**可变的**,让设计更灵活。
|
|
|
|
|
|
|
|
|
|
当变量不可变时,这意味着一旦一个值绑定到一个变量 `a` 后,就不能再更改 `a` 的值了。为了说明,在我们的工程目录下使用 `cargo new variables` 来创建一个名为 _variables_ 的新项目。
|
|
|
|
|
如果变量 `a` 不可变,那么一旦为它绑定值,就不能再修改 `a`。举个例子,在我们的工程目录下使用 `cargo new variables` 新建一个项目,叫做 _variables_ 。
|
|
|
|
|
|
|
|
|
|
然后在新建的 _variables_ 目录下,打开 _src/main.rs_ 并将代码替换为下面还未能通过编译的代码:
|
|
|
|
|
然后在新建的 _variables_ 目录下,编辑 _src/main.rs_ ,改为下面代码:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
fn main() {
|
|
|
|
@ -41,7 +41,7 @@ fn main() {
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
保存文件,并使用 `cargo run` 运行程序,你将会收到一条错误消息,输出如下所示:
|
|
|
|
|
保存文件,再使用 `cargo run` 运行它,迎面而来的是一条错误提示:
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
$ cargo run
|
|
|
|
@ -61,7 +61,7 @@ error[E0384]: cannot assign twice to immutable variable `x`
|
|
|
|
|
error: aborting due to previous error
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
具体的错误原因是 `cannot assign twice to immutable variable x`(对不可变的变量无法进行二次再赋值),因为我们尝试给不可变的 `x` 变量赋予了第二个值。
|
|
|
|
|
具体的错误原因是 `cannot assign twice to immutable variable x`(无法对不可变的变量进行重复赋值),因为我们想为不可变的 `x` 变量再次赋值。
|
|
|
|
|
|
|
|
|
|
这种错误是为了避免无法预期的错误发生在我们的变量上:一个变量往往被多处代码所使用,其中一部分代码假定该变量的值永远不会改变,而另外一部分代码却无情的改变了这个值,在实际开发过程中,这个错误是很难被发现的,特别是在多线程编程中。
|
|
|
|
|
|
|
|
|
|