mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-28 23:20:10 +08:00
parent
55b56cae18
commit
34d183d532
@ -3,30 +3,32 @@
|
||||
[#]: author: "Pratham Patel https://itsfoss.com/author/pratham/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "Cubik65536"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15771-1.html"
|
||||
|
||||
Rust 基础系列 #2: 在 Rust 程序中使用变量和常量
|
||||
======
|
||||
|
||||
![][1]
|
||||
![][0]
|
||||
|
||||
在 [该系列的第一章](https://linux.cn/article-15709-1.html) 中,我讲述了为什么 Rust 是一门越来越流行的编程语言。我还展示了如何 [在 Rust 中编写 Hello World 程序](https://linux.cn/article-15709-1.html)。
|
||||
> 推进你的 Rust 学习,熟悉 Rust 程序的变量和常量。
|
||||
|
||||
让我们继续 Rust 之旅。在本文中,我将向您介绍 Rust 编程语言中的变量和常量。
|
||||
在 [该系列的第一章][2]中,我讲述了为什么 Rust 是一门越来越流行的编程语言。我还展示了如何 [在 Rust 中编写 Hello World 程序][2]。
|
||||
|
||||
此外,我还将讲解一个称为“遮蔽”的新编程概念。
|
||||
让我们继续 Rust 之旅。在本文中,我将向你介绍 Rust 编程语言中的变量和常量。
|
||||
|
||||
此外,我还将讲解一个称为“<ruby>遮蔽<rt>shadowing</rt></ruby>”的新编程概念。
|
||||
|
||||
### Rust 变量的独特之处
|
||||
|
||||
在 Rust 等编程语言中,变量是指 _存储某些数据的内存地址的别名_ 。
|
||||
在编程语言中,变量是指 _存储某些数据的内存地址的一个别名_ 。
|
||||
|
||||
对 Rust 语言来讲也是如此。但是 Rust 有一个独特的“特性”。每个你声明的变量都是 **默认不可变的** 。这意味着一旦给变量赋值,就不能再改变它的值。
|
||||
对 Rust 语言来讲也是如此。但是 Rust 有一个独特的“特性”。每个你声明的变量都是 **默认 <ruby>不可变的<rt>immutable</rt></ruby>** 。这意味着一旦给变量赋值,就不能再改变它的值。
|
||||
|
||||
这个决定是为了确保默认情况下,你不需要使用 _自旋锁_ 或 _互斥锁_ 等特殊机制来引入多线程。Rust **会保证** 安全的并发。由于所有变量(默认情况下)都是不可变的,因此你不需要担心线程会无意中更改变量值。
|
||||
这个决定是为了确保默认情况下,你不需要使用 <ruby>自旋锁<rt>spin lock</rt></ruby> 或 <ruby>互斥锁<rt>mutex</rt></ruby> 等特殊机制来引入多线程。Rust **会保证** 安全的并发。由于所有变量(默认情况下)都是不可变的,因此你不需要担心线程会无意中更改变量值。
|
||||
|
||||
这并不是在说 Rust 中的变量就像常量一样,因为它们确实不是。变量可以被显式地定义为可变的。这样的变量称为 **可变变量** 。
|
||||
这并不是在说 Rust 中的变量就像常量一样,因为它们确实不是常量。变量可以被显式地定义为可变的。这样的变量称为 **可变变量** 。
|
||||
|
||||
这是在 Rust 中声明变量的语法:
|
||||
|
||||
@ -41,10 +43,10 @@ let mut variable_name = value;
|
||||
```
|
||||
|
||||
> 🚧 尽管你可以改变可变变量的值,但你不能将另一种数据类型的值赋值给它。
|
||||
>
|
||||
> 这意味着,如果你有一个可变的浮点型变量,你不能在后面将一个字符赋值给它。
|
||||
|
||||
这意味着,如果你有一个可变的浮点型变量,你不能在后面将一个字符赋值给它。
|
||||
|
||||
### Rust 数据类型的高级概述
|
||||
### Rust 数据类型概观
|
||||
|
||||
在上一篇文章中,你可能注意到了我提到 Rust 是一种强类型语言。但是在定义变量时,你不需要指定数据类型,而是使用一个通用的关键字 `let`。
|
||||
|
||||
@ -54,7 +56,7 @@ Rust 编译器可以根据赋值给变量的值推断出变量的数据类型。
|
||||
let variable_name: data_type = value;
|
||||
```
|
||||
|
||||
接下来是 Rust 编程语言中一些常见的数据类型:
|
||||
下面是 Rust 编程语言中一些常见的数据类型:
|
||||
|
||||
- **整数类型**:分别用于有符号和无符号的 32 位整数的 `i32` 和 `u32`
|
||||
- **浮点类型**:分别用于 32 位和 64 位浮点数的 `f32` 和 `f64`
|
||||
@ -93,7 +95,7 @@ Rust 还强制要求在读取存储在其中的值之前初始化变量。
|
||||
- 通过执行“正常”的任务来理解 Rust 的设计,这些任务实际上是内存相关问题的主要原因
|
||||
- 阅读和理解 Rust 编译器的错误/警告信息
|
||||
|
||||
##### 测试变量的不可变性
|
||||
#### 测试变量的不可变性
|
||||
|
||||
让我们故意写一个试图修改不可变变量的程序,看看接下来会发生什么。
|
||||
|
||||
@ -134,7 +136,7 @@ error: aborting due to previous error
|
||||
For more information about this error, try `rustc --explain E0384`.
|
||||
```
|
||||
|
||||
> 📋 'binding' 一词是指变量名。但这只是一个简单的解释。
|
||||
> 📋 “binding” 一词是指变量名。但这只是一个简单的解释。
|
||||
|
||||
这很好的展示了 Rust 强大的错误检查和信息丰富的错误信息。第一行展示了阻止上述代码编译的错误信息:
|
||||
|
||||
@ -146,11 +148,11 @@ error[E0384]: cannot assign twice to immutable variable b
|
||||
|
||||
编译器甚至可以识别出错误发生的确切行和列号。
|
||||
|
||||
在显示 `first assignment to `b`` 的行下面,是提供帮助的行。因为我正在改变不可变变量 `b` 的值,所以我被告知使用 `mut` 关键字将变量 `b` 声明为可变变量。
|
||||
在显示 `first assignment to b` 的行下面,是提供帮助的行。因为我正在改变不可变变量 `b` 的值,所以我被告知使用 `mut` 关键字将变量 `b` 声明为可变变量。
|
||||
|
||||
> 🖥️ 自己实现一个修复来更好地理解手头的问题。
|
||||
|
||||
##### 使用未初始化的变量
|
||||
#### 使用未初始化的变量
|
||||
|
||||
现在,让我们看看当我们尝试读取未初始化变量的值时,Rust 编译器会做什么。
|
||||
|
||||
@ -200,7 +202,7 @@ For more information about this error, try `rustc --explain E0381`.
|
||||
|
||||
但是这是荒谬的!变量 `b` 的值在第 7 行被访问了。但是仔细看;警告是关于第 8 行的。这很令人困惑;让我们暂时跳过这个警告,继续看错误。
|
||||
|
||||
这个错误信息说 `used binding `b` is possibly-uninitialized`。和之前的例子一样,Rust 编译器指出错误是由于尝试在第 7 行读取变量 `b` 的值而引起的。读取变量 `b` 的值是错误的原因是它的值没有初始化。在 Rust 编程语言中,这是非法的。因此编译时错误出现。
|
||||
这个错误信息说 `used binding b is possibly-uninitialized`。和之前的例子一样,Rust 编译器指出错误是由于尝试在第 7 行读取变量 `b` 的值而引起的。读取变量 `b` 的值是错误的原因是它的值没有初始化。在 Rust 编程语言中,这是非法的。因此编译时错误出现。
|
||||
|
||||
> 🖥️ 这个错误可以很容易地通过交换第 7 和第 8 行的代码来解决。试一下,看看错误是否消失了。
|
||||
|
||||
@ -266,7 +268,7 @@ fn main() {
|
||||
|
||||
#### 示例程序:一个生锈的温度计
|
||||
|
||||
> 译注:这里的温度计“生锈”了是因为它是使用 Rust(生锈)编写的,原作者在这里玩了一个双关。
|
||||
(LCTT 译注:这里的温度计“生锈”了是因为它是使用 Rust(生锈)编写的,原作者在这里玩了一个双关。)
|
||||
|
||||
接下来是一个典型的程序,它将华氏度转换为摄氏度,反之亦然。
|
||||
|
||||
@ -289,7 +291,7 @@ fn main() {
|
||||
}
|
||||
```
|
||||
|
||||
没什么大不了的... 华氏温度转换为摄氏温度,反之亦然。
|
||||
没什么大不了的……华氏温度转换为摄氏温度,反之亦然。
|
||||
|
||||
正如你在这里看到的,由于 Rust 不允许自动类型转换,我不得不在整数 32、9 和 5 后放一个小数点。除此之外,这与你在 C、C++ 和/或 Java 中所做的类似。
|
||||
|
||||
@ -307,7 +309,7 @@ const CONSTANT_NAME: data_type = value;
|
||||
|
||||
如你所见,声明常量的语法与我们在 Rust 中看到的变量声明非常相似。但是有两个不同之处:
|
||||
|
||||
- 常量的名字需要使用 `SCREAMING_SNAKE_CASE`。所有的大写字母和单词之间用下划线分隔。
|
||||
- 常量的名字需要像 `SCREAMING_SNAKE_CASE` 这样。所有的大写字母和单词之间用下划线分隔。
|
||||
- 常量的数据类型**必须**被显性定义。
|
||||
|
||||
#### 变量与常量的对比
|
||||
@ -412,6 +414,8 @@ c 的地址: 0x7ffe954bf734, c 的值: 29 // 遮蔽后
|
||||
|
||||
与此同时,如果你有任何问题,请告诉我。
|
||||
|
||||
*(题图:MJ/7c5366b8-f926-487e-9153-0a877145ca5)*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/rust-variables/
|
||||
@ -419,14 +423,15 @@ via: https://itsfoss.com/rust-variables/
|
||||
作者:[Pratham Patel][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[Cubik](https://github.com/Cubik65536)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/pratham/
|
||||
[b]: https://github.com/lkxed/
|
||||
[1]: https://itsfoss.com/content/images/2023/03/linux-mega-packt.webp
|
||||
[2]: https://itsfoss.com/rust-introduction/
|
||||
[2]: https://linux.cn/article-15709-1.html
|
||||
[3]: https://doc.rust-lang.org/book/appendix-02-operators.html?ref=itsfoss.com#operators
|
||||
[4]: https://blog.thefossguy.com/posts/immutable-vars-vs-constants-rs.md?ref=itsfoss.com
|
||||
[5]: https://itsfoss.com/content/images/2023/02/image.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202305/01/144948gp13zdindx50ll0p.png
|
Loading…
Reference in New Issue
Block a user