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>
|
||||
|
||||
|
@ -109,7 +109,7 @@ println!("{}", s); // This will print `hello, world!`
|
||||
|
||||
第一部分由我们完成:当调用`String::from`时,它的实现请求它需要的内存。这在编程语言中是非常通用的。
|
||||
|
||||
然而,第二部分实现起来就各有区别了。在有**垃圾回收(GC)**的语言中, GC 记录并清除不再使用的内存,而我们作为程序员,并不需要关心他们。没有 GC 的话,识别出不再使用的内存并调用代码显式释放就是我们程序员的责任了,正如请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要`allocate`和`free`一一对应。
|
||||
然而,第二部分实现起来就各有区别了。在有**垃圾回收**(*GC*)的语言中, GC 记录并清除不再使用的内存,而我们作为程序员,并不需要关心他们。没有 GC 的话,识别出不再使用的内存并调用代码显式释放就是我们程序员的责任了,正如请求内存的时候一样。从历史的角度上说正确处理内存回收曾经是一个困难的编程问题。如果忘记回收了会浪费内存。如果过早回收了,将会出现无效变量。如果重复回收,这也是个 bug。我们需要`allocate`和`free`一一对应。
|
||||
|
||||
Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域后就被自动释放。下面是列表 4-1 中作用域例子的一个使用`String`而不是字符串字面值的版本:
|
||||
|
||||
|
@ -188,7 +188,7 @@ immutable
|
||||
|
||||
### 悬垂引用
|
||||
|
||||
在存在指针的语言中,容易通过释放内存时保留指向它的指针而错误地生成一个**悬垂指针**(*dangling pointer*),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者,。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当我们拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。
|
||||
在存在指针的语言中,容易通过释放内存时保留指向它的指针而错误地生成一个**悬垂指针**(*dangling pointer*),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当我们拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。
|
||||
|
||||
让我们尝试创建一个悬垂引用:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user