Merge pull request #184 from xiaods/patch-7

把函数签名改成声明,更符合语境。
This commit is contained in:
KaiserY 2018-05-11 09:16:05 +08:00 committed by GitHub
commit 43f7902840
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,7 +8,7 @@
这里有一个小的编程问题:编写一个获取一个字符串并返回它在其中找到的第一个单词的函数。如果函数没有在字符串中找到一个空格,就意味着整个字符串是一个单词,所以整个字符串都应返回。 这里有一个小的编程问题:编写一个获取一个字符串并返回它在其中找到的第一个单词的函数。如果函数没有在字符串中找到一个空格,就意味着整个字符串是一个单词,所以整个字符串都应返回。
让我们考虑一下这个函数的签名 让我们考虑一下这个函数的声明
```rust,ignore ```rust,ignore
fn first_word(s: &String) -> ? fn first_word(s: &String) -> ?
@ -93,7 +93,7 @@ fn main() {
这个程序编译时没有任何错误,而且在调用 `s.clear()` 之后使用 `word` 也不会出错。这时 `word``s` 状态就完全没有联系了,所以 `word `仍然包含值 `5`。可以尝试用值 `5` 来提取变量 `s` 的第一个单词,不过这是有 bug 的,因为在我们将 `5` 保存到 `word` 之后 `s` 的内容已经改变。 这个程序编译时没有任何错误,而且在调用 `s.clear()` 之后使用 `word` 也不会出错。这时 `word``s` 状态就完全没有联系了,所以 `word `仍然包含值 `5`。可以尝试用值 `5` 来提取变量 `s` 的第一个单词,不过这是有 bug 的,因为在我们将 `5` 保存到 `word` 之后 `s` 的内容已经改变。
我们不得不时刻担心 `word` 的索引与 `s` 中的数据不再同步,这是冗余且容易出错的!如果编写这么一个 `second_word` 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样: 我们不得不时刻担心 `word` 的索引与 `s` 中的数据不再同步,这是冗余且容易出错的!如果编写这么一个 `second_word` 函数的话,管理索引这件事将更加容易出问题。它的声明看起来像这样:
```rust,ignore ```rust,ignore
fn second_word(s: &String) -> (usize, usize) { fn second_word(s: &String) -> (usize, usize) {
@ -157,7 +157,7 @@ let slice = &s[..];
> 注意:字符串 slice range 的索引必须位于有效的 UTF-8 字符边界内,如果尝试从一个多字节字符的中间位置创建字符串 slice则程序将会因错误而退出。出于介绍字符串 slice 的目的,本部分假设只使用 ASCII 字符集;第八章的 “字符串” 部分会更加全面的讨论 UTF-8 处理问题。 > 注意:字符串 slice range 的索引必须位于有效的 UTF-8 字符边界内,如果尝试从一个多字节字符的中间位置创建字符串 slice则程序将会因错误而退出。出于介绍字符串 slice 的目的,本部分假设只使用 ASCII 字符集;第八章的 “字符串” 部分会更加全面的讨论 UTF-8 处理问题。
在记住所有这些知识后,让我们重写 `first_word` 来返回一个 slice。“字符串 slice” 的类型签名写作 `&str` 在记住所有这些知识后,让我们重写 `first_word` 来返回一个 slice。“字符串 slice” 的类型声明写作 `&str`
<span class="filename">文件名: src/main.rs</span> <span class="filename">文件名: src/main.rs</span>
@ -228,7 +228,7 @@ let s = "Hello, world!";
#### 字符串 slice 作为参数 #### 字符串 slice 作为参数
在知道了能够获取字面值和 `String` 的 slice 后引起了另一个对 `first_word` 的改进,这是它的签名 在知道了能够获取字面值和 `String` 的 slice 后引起了另一个对 `first_word` 的改进,这是它的声明
```rust,ignore ```rust,ignore
fn first_word(s: &String) -> &str { fn first_word(s: &String) -> &str {