diff --git a/src/ch04-01-what-is-ownership.md b/src/ch04-01-what-is-ownership.md index 3a817a7..a2b1f21 100644 --- a/src/ch04-01-what-is-ownership.md +++ b/src/ch04-01-what-is-ownership.md @@ -44,7 +44,7 @@ Rust 的核心功能(之一)是**所有权**(*ownership*)。虽然这个 ### 变量作用域 -我们在第二章已经完成过一个 Rust 程序的例子了。现在我们已经掌握了基本语法,所以不会在所有的例子中包含`fn main() {`代码了,所以如果你是一路跟过来的,必须手动将之后例子的代码放入一个`main`函数中。为此,例子将显得更加具体,使我们可以关注具体细节而不是样板代码。 +我们已经在第二章完成过一个 Rust 程序的例子。现在我们已经掌握了基本语法,所以不会在所有的例子中包含`fn main() {`代码了,所以如果你是一路跟过来的,必须手动将之后例子的代码放入一个`main`函数中。为此,例子将显得更加具体,使我们可以关注具体细节而不是样板代码。 作为所有权的第一个例子,我们看看一些变量的**作用域**(*scope*)。作用域是一个项(原文:item)在程序中有效的范围。假如有一个这样的变量: diff --git a/src/ch04-02-references-and-borrowing.md b/src/ch04-02-references-and-borrowing.md index 6cbbcbe..54634ca 100644 --- a/src/ch04-02-references-and-borrowing.md +++ b/src/ch04-02-references-and-borrowing.md @@ -137,11 +137,11 @@ error[E0499]: cannot borrow `s` as mutable more than once at a time **数据竞争**是一种特定类型的竞争状态,它可由这三个行为造成: -1. 两个或更多指针同时访问相同的数据。 -2. 至少有一个指针被用来写数据。 -3. 没有被用来同步数据访问的机制。 +1. 两个或更多指针同时访问同一数据。 +2. 至少有一个指针被写入。 +3. 没有同步数据访问的机制。 -数据竞争会导致未定义行为并且当在运行时尝试追踪时可能会变得难以诊断和修复;Rust 阻止了这种情况的发生,因为存在数据竞争的代码根本就不能编译! +数据竞争会导致未定义行为,在运行时难以追踪,并且难以诊断和修复;Rust 避免了这种情况,它拒绝编译存在数据竞争的代码! 一如既往,可以使用大括号来创建一个新的作用域来允许拥有多个可变引用,只是不能**同时**拥有: diff --git a/src/ch08-02-strings.md b/src/ch08-02-strings.md index 927a6dc..6a5e17e 100644 --- a/src/ch08-02-strings.md +++ b/src/ch08-02-strings.md @@ -223,7 +223,7 @@ let s = &hello[0..4]; 这里,`s`是一个`&str`,它包含字符串的头四个字节。早些时候,我们提到了这些字母都是两个字节长的,所以这意味着`s`将会是“Зд”。 -如果获取`&hello[0..1]`会发生什么呢?回答是:在运行时会 panic,就跟访问 vector 中的无效索引时一样: +如果获取`&hello[0..1]`会发生什么呢?答案是:在运行时会 panic,就跟访问 vector 中的无效索引时一样: ```text diff --git a/src/ch17-02-trait-objects.md b/src/ch17-02-trait-objects.md index 4a0779d..647fe18 100644 --- a/src/ch17-02-trait-objects.md +++ b/src/ch17-02-trait-objects.md @@ -18,11 +18,11 @@ get Chapter 8 for editing. /Carol --> ### 定义一个带有自定义行为的Trait -不过,在Rust语言中,我们可以定义一个名为`Draw`的trait,其上有一个名为`draw`的方法。我们定义一个带有*trait对象*的vector,绑定了一种指针的trait,比如`&`引用或者一个`Box`智能指针。 +不过,在Rust语言中,我们可以定义一个 `Draw` trait,包含名为 `draw` 的方法。我们定义一个由*trait对象*组成的vector,绑定了某指针的trait,比如`&`引用或者一个`Box`智能指针。 -我们提到,我们不会称结构体和枚举为对象,这是为了区分于其他语言的结构体和枚举对象。结构体或者枚举成员中的数据和`impl`块中的行为是分开的,而其他语言则是数据和行为被组合到一个被称作对象的概念里。Trait对象更像其他语言的对象,之所以这样说是因为,他们把由其指针所指向的具体对象作为数据,把在trait中定义的方法作为行为,组合在了一起。但是,trait对象和其他语言是不同的,因为我们不能向一个trait对象增加数据。trait对象不像其他语言那样有用:它们的目的是允许从公有的行为上抽象。 +之前提到,我们不会称结构体和枚举为对象,以区分其他语言的结构体和枚举对象。结构体或者枚举成员中的数据和`impl`块中的行为是分开的,而其他语言则是数据和行为被组合到一个对象里。Trait 对象更像其他语言的对象,因为他们将其指针指向的具体对象作为数据,将在trait 中定义的方法作为行为,组合在了一起。但是,trait 对象和其他语言是不同的,我们不能向一个 trait 对象增加数据。trait 对象不像其他语言那样有用:它们的目的是允许从公有行为上抽象。 -trait定义了在给定情况下我们所需要的行为。在我们需要使用一个实体类型或者一个通用类型的地方,我们可以把trait当作trait对象使用。Rust的类型系统会保证我们为trait对象带入的任何值会实现trait的方法。我们不需要在编译阶段知道所有可能的类型,我们可以把所有的实例统一对待。Listing 17-03展示了如何定义一个名为`Draw`的带有`draw`方法的trait。 +trait 对象定义了给定情况下应有的行为。当需要具有某种特性的不确定具体类型时,我们可以把 trait 对象当作 trait 使用。Rust 的类型系统会保证我们为 trait 对象带入的任何值会实现 trait 的方法。我们不需要在编译阶段知道所有可能的类型,却可以把所有的实例统一对待。Listing 17-03展示了如何定义一个名为`Draw`的带有`draw`方法的trait。 Filename: src/lib.rs @@ -36,7 +36,7 @@ pub trait Draw { -因为我们已经在第10章讨论过如何定义trait,你可能比较熟悉。下面是新的定义:Listing 17-4有一个名为`Screen`的结构体,里面有一个名为`components`的vector,`components`的类型是Box。`Box`是一个trait对象:它是`Box`内部任意一个实现了`Draw`trait的类型的替身。 +因为我们已经在第10章讨论过如何定义 trait,你可能比较熟悉。下面是新的定义:Listing 17-4有一个名为 `Screen` 的结构体,里面有一个名为 `components` 的 vector,`components` 的类型是Box。`Box` 是一个 trait 对象:它是 `Box` 内部任意一个实现了 `Draw` trait 的类型的替身。 Filename: src/lib.rs @@ -50,11 +50,11 @@ pub struct Screen { } ``` -Listing 17-4: 定义一个`Screen`结构体,带有一个含有实现了`Draw`trait的`components` vector成员 +Listing 17-4: 定义一个 `Screen` 结构体,带有一个含有实现了 `Draw` trait 的 `components` vector 成员 -在`Screen`结构体上,我们将要定义一个`run`方法,该方法会在它的`components`上调用`draw`方法,如Listing 17-5所示: +在 `Screen` 结构体上,我们将要定义一个 `run` 方法,该方法会在它的 `components` 上调用 `draw` 方法,如Listing 17-5所示: Filename: src/lib.rs @@ -76,10 +76,10 @@ impl Screen { } ``` -Listing 17-5:在`Screen`上实现一个`run`方法,该方法在每个组件上调用`draw`方法 +Listing 17-5:在 `Screen` 上实现一个 `run` 方法,该方法在每个组件上调用 `draw` 方法 -这不同于定义一个使用带有trait限定的泛型参数的结构体。泛型参数一次只能被一个实体类型替代,而trait对象可以在运行时允许多种实体类型填充trait对象。比如,我们已经定义了`Screen`结构体使用泛型和一个trait限定,如Listing 17-6所示: +这与带 trait 约束的泛型结构体不同(trait 约束泛型参数)。泛型参数一次只能被一个具体类型替代,而 trait 对象可以在运行时允许多种具体类型填充 trait 对象。比如,我们已经定义了 `Screen` 结构体使用泛型和一个 trait 约束,如Listing 17-6所示: Filename: src/lib.rs @@ -102,16 +102,16 @@ impl Screen } ``` -Listing 17-6: 一种`Screen`结构体的替代实现,它的`run`方法使用通用类型和trait绑定 +Listing 17-6: 一种 `Screen` 结构体的替代实现,它的 `run` 方法使用通用类型和 trait 绑定 -这个例子只能使我们的`Screen`实例的所有组件类型全是`Button`,或者全是`TextField`。如果你的组件集合是单一类型的,那么可以优先使用泛型和trait限定,这是因为其使用的具体类型在编译阶段可以被定意为是单一的。 +这个例子中,`Screen` 实例所有组件类型必需全是 `Button`,或者全是 `TextField`。如果你的组件集合是单一类型的,那么可以优先使用泛型和 trait 约束,因为其使用的具体类型在编译阶段即可确定。 -而如果使用内部有`Vec>` trait对象的列表的`Screen`结构体,`Screen`实例可以同时包含`Box