|
|
@ -2,7 +2,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
> [ch03-02-data-types.md](https://github.com/rust-lang/book/blob/main/src/ch03-02-data-types.md)
|
|
|
|
> [ch03-02-data-types.md](https://github.com/rust-lang/book/blob/main/src/ch03-02-data-types.md)
|
|
|
|
> <br>
|
|
|
|
> <br>
|
|
|
|
> commit 1b8746013079f2e2ce1c8e85f633d9769778ea7f
|
|
|
|
> commit 4284e160715917a768d25265daf2db897c683065
|
|
|
|
|
|
|
|
|
|
|
|
在 Rust 中,每一个值都属于某一个 **数据类型**(*data type*),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound)。
|
|
|
|
在 Rust 中,每一个值都属于某一个 **数据类型**(*data type*),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound)。
|
|
|
|
|
|
|
|
|
|
|
@ -12,7 +12,7 @@
|
|
|
|
let guess: u32 = "42".parse().expect("Not a number!");
|
|
|
|
let guess: u32 = "42".parse().expect("Not a number!");
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
这里如果不添加类型注解,Rust 会显示如下错误,这说明编译器需要我们提供更多信息,来了解我们想要的类型:
|
|
|
|
如果不像上面这样添加类型注解 `: u32`,Rust 会显示如下错误,这说明编译器需要我们提供更多信息,来了解我们想要的类型:
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
```console
|
|
|
|
{{#include ../listings/ch03-common-programming-concepts/output-only-01-no-type-annotations/output.txt}}
|
|
|
|
{{#include ../listings/ch03-common-programming-concepts/output-only-01-no-type-annotations/output.txt}}
|
|
|
@ -154,9 +154,9 @@ Rust的 `char` 类型是语言中最原生的字母类型。下面是一些声
|
|
|
|
{{#rustdoc_include ../listings/ch03-common-programming-concepts/no-listing-12-tuple-indexing/src/main.rs}}
|
|
|
|
{{#rustdoc_include ../listings/ch03-common-programming-concepts/no-listing-12-tuple-indexing/src/main.rs}}
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
这个程序创建了一个元组,`x`,并接着使用索引为每个元素创建新变量。跟大多数编程语言一样,元组的第一个索引值是 0。
|
|
|
|
这个程序创建了一个元组,`x`,然后使用其各自的索引访问元组中的每个元素。跟大多数编程语言一样,元组的第一个索引值是 0。
|
|
|
|
|
|
|
|
|
|
|
|
没有任何值的元组 `()` 是一种特殊的类型,只有一个值,也写成 `()` 。该类型被称为 **单元类型**(*unit type*),而该值被称为 **单元值**(*unit value*)。如果表达式不返回任何其他值,则会隐式返回单元值。
|
|
|
|
不带任何值的元组有个特殊的名称,叫做 **单元(unit)** 元组。这种值以及对应的类型都写作 `()`,表示空值或空的返回类型。如果表达式不返回任何其他值,则会隐式返回单元值。
|
|
|
|
|
|
|
|
|
|
|
|
#### 数组类型
|
|
|
|
#### 数组类型
|
|
|
|
|
|
|
|
|
|
|
@ -226,7 +226,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
|
|
|
|
|
|
|
|
|
|
|
|
程序在索引操作中使用一个无效的值时导致 **运行时** 错误。程序带着错误信息退出,并且没有执行最后的 `println!` 语句。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 *panic*,这是 Rust 术语,它用于程序因为错误而退出的情况。这种检查必须在运行时进行,特别是在这种情况下,因为编译器不可能知道用户在以后运行代码时将输入什么值。
|
|
|
|
程序在索引操作中使用一个无效的值时导致 **运行时** 错误。程序带着错误信息退出,并且没有执行最后的 `println!` 语句。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 *panic*,这是 Rust 术语,它用于程序因为错误而退出的情况。这种检查必须在运行时进行,特别是在这种情况下,因为编译器不可能知道用户在以后运行代码时将输入什么值。
|
|
|
|
|
|
|
|
|
|
|
|
这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问并继续执行,Rust 让你避开此类错误。第九章会讨论更多 Rust 的错误处理。
|
|
|
|
这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。
|
|
|
|
|
|
|
|
|
|
|
|
[comparing-the-guess-to-the-secret-number]:
|
|
|
|
[comparing-the-guess-to-the-secret-number]:
|
|
|
|
ch02-00-guessing-game-tutorial.html#comparing-the-guess-to-the-secret-number
|
|
|
|
ch02-00-guessing-game-tutorial.html#comparing-the-guess-to-the-secret-number
|
|
|
|