mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-09 08:51:18 +08:00
commit
86b0ac1f7d
@ -150,7 +150,7 @@ Rust 的`char`类型代表了一个 Unicode 变量值(Unicode Scalar Value)
|
|||||||
|
|
||||||
元组是一个将多个其他类型的值组合进一个复合类型的主要方式。
|
元组是一个将多个其他类型的值组合进一个复合类型的主要方式。
|
||||||
|
|
||||||
我们使用一个括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这写不同值的类型也不必是相同的。这个例子中使用了额外的可选类型注解:
|
我们使用一个括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。这个例子中使用了额外的可选类型注解:
|
||||||
|
|
||||||
<span class="filename">Filename: src/main.rs</span>
|
<span class="filename">Filename: src/main.rs</span>
|
||||||
|
|
||||||
@ -264,4 +264,4 @@ error: Process didn't exit successfully: `target/debug/arrays` (exit code: 101)
|
|||||||
|
|
||||||
编译并没有产生任何错误,不过程序会导致一个**运行时**(*runtime*)错误并且不会成功退出。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会*panic*,这是 Rust 中的术语,它用于程序因为错误而退出的情况。
|
编译并没有产生任何错误,不过程序会导致一个**运行时**(*runtime*)错误并且不会成功退出。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会*panic*,这是 Rust 中的术语,它用于程序因为错误而退出的情况。
|
||||||
|
|
||||||
这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。Rust 通过立即退出而不是允许内存访问并继续执行来使你免受这类错误困扰。第九章会讨论更多 Rust 的错误处理。
|
这是第一个在实战中遇到的 Rust 安全原则的例子。在很多底层语言中,并没有进行这类检查,这样当提供了一个不正确的索引时,就会访问无效的内存。Rust 通过立即退出而不是允许内存访问并继续执行来使你免受这类错误困扰。第九章会讨论更多 Rust 的错误处理。
|
||||||
|
@ -109,7 +109,7 @@ println!("{}", s); // This will print `hello, world!`
|
|||||||
|
|
||||||
第一部分由我们完成:当调用`String::from`时,它的实现请求它需要的内存。这在编程语言中是非常通用的。
|
第一部分由我们完成:当调用`String::from`时,它的实现请求它需要的内存。这在编程语言中是非常通用的。
|
||||||
|
|
||||||
然而,第二部分实现起来就各有区别了。在有**垃圾回收(GC)**的语言中, GC 记录并清除不再使用的内存,而我们作为程序员,并不需要关心他们。没有 GC 的话,识别出不再使用的内存并调用代码显式释放就是我们程序员的责任了,正如请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要`allocate`和`free`一一对应。
|
然而,第二部分实现起来就各有区别了。在有**垃圾回收**(*GC*)的语言中, GC 记录并清除不再使用的内存,而我们作为程序员,并不需要关心他们。没有 GC 的话,识别出不再使用的内存并调用代码显式释放就是我们程序员的责任了,正如请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要`allocate`和`free`一一对应。
|
||||||
|
|
||||||
Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放。下面是列表 4-1 中作用域例子的一个使用`String`而不是字符串字面值的版本:
|
Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放。下面是列表 4-1 中作用域例子的一个使用`String`而不是字符串字面值的版本:
|
||||||
|
|
||||||
|
@ -188,7 +188,7 @@ immutable
|
|||||||
|
|
||||||
### 悬垂引用
|
### 悬垂引用
|
||||||
|
|
||||||
在存在指针的语言中,容易通过释放内存时保留指向它的指针而错误地生成一个**悬垂指针**(*dangling pointer*),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者,。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当我们拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。
|
在存在指针的语言中,容易通过释放内存时保留指向它的指针而错误地生成一个**悬垂指针**(*dangling pointer*),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当我们拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。
|
||||||
|
|
||||||
让我们尝试创建一个悬垂引用:
|
让我们尝试创建一个悬垂引用:
|
||||||
|
|
||||||
@ -264,4 +264,4 @@ fn no_dangle() -> String {
|
|||||||
* 任意数量的不可变引用。
|
* 任意数量的不可变引用。
|
||||||
2. 引用必须总是有效的。
|
2. 引用必须总是有效的。
|
||||||
|
|
||||||
接下来,我们来看看一种不同类型的引用:slice。
|
接下来,我们来看看一种不同类型的引用:slice。
|
||||||
|
Loading…
Reference in New Issue
Block a user