Merge pull request #100 from Cyperwu/patch-2

修复一些翻译错误
pull/101/head
KaiserY 7 years ago committed by GitHub
commit dcff0dc76c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -176,7 +176,7 @@ error[E0106]: missing lifetime specifier
生命周期注解有着一个不太常见的语法:生命周期参数名称必须以撇号(`'`)开头。生命周期参数的名称通常全是小写,而且类似于泛型类型,其名称通常非常短。`'a` 是大多数人默认使用的名称。生命周期参数注解位于引用的 `&` 之后,并有一个空格来将引用类型与生命周期注解分隔开。
这里有一些例子:我们有一个没有生命周期参数的 `i32` 的引用,一个有叫做 `'a` 的生命周期参数的 `i32` 的引用,和一个也有的生命周期参数 `'a``i32` 的可变引用:
这里有一些例子:我们有一个没有生命周期参数的 `i32` 的引用,一个有叫做 `'a` 的生命周期参数的 `i32` 的引用,和一个生命周期也是 `'a``i32` 的可变引用:
```rust,ignore
&i32 // a reference
@ -184,7 +184,7 @@ error[E0106]: missing lifetime specifier
&'a mut i32 // a mutable reference with an explicit lifetime
```
生命周期注解本身没有多少意义:生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系。如果函数有一个生命周期 `'a``i32` 的引用的参数 `first`,还有另一个同样是生命周期 `'a``i32` 的引用的参数 `second`,这两个生命周期注解有相同的名称意味着 `first``second` 必须与这相同的泛型生命周期存在得一样久。
单个的生命周期注解本身没有多少意义:生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系。如果函数有一个生命周期 `'a``i32` 的引用的参数 `first`,还有另一个同样是生命周期 `'a``i32` 的引用的参数 `second`,这两个生命周期注解有相同的名称意味着 `first``second` 必须与这相同的泛型生命周期存在得一样久。
### 函数签名中的生命周期注解
@ -208,7 +208,7 @@ fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
现在函数签名表明对于某些生命周期 `'a`,函数会获取两个参数,他们都是与生命周期 `'a` 存在的一样长的字符串 slice。函数会返回一个同样也与生命周期 `'a` 存在的一样长的字符串 slice。这就是我们告诉 Rust 需要其保证的协议。
通过在函数签名中指定生命周期参数,不会改变任何参数或返回值的生命周期,不过我们说过任何不坚持这个协议的类型都将被借用检查器拒绝。这个函数并不知道(或需要知道)`x` 和 `y` 具体会存在多久,不过只需要知道一些可以使用 `'a` 替代的作用域将会满足这个签名。
我们并不会通过“在函数签名中指定生命周期参数”这种方式来改变任何参数或返回值的生命周期,而是指出任何不遵守这个协议的传入值都将被借用检查器拒绝。这个函数并不知道(或需要知道)`x` 和 `y` 具体会存在多久,而只需要知道有某个可以被 `'a` 替代的作用域将会满足这个签名。
当在函数中使用生命周期注解时,这些注解出现在函数签名中,而不存在于函数体中的任何代码中。这是因为 Rust 能够分析函数中代码而不需要任何协助,不过当函数引用或被函数之外的代码引用时,参数或返回值的生命周期可能在每次函数被调用时都不同。这可能会产生惊人的消耗并且对于 Rust 来说通常是不可能分析的。在这种情况下,我们需要自己标注生命周期。
@ -240,7 +240,7 @@ fn main() {
<span class="caption">示例 10-24通过拥有不同的具体生命周期的 `String` 值调用 `longest` 函数</span>
接下来,让我们尝试一个 `result` 的引用的生命周期必须比两个参数的要短的例子。将 `result` 变量的声明从内部作用域中移动出来,不过`result``string2` 变量的赋值语句一同放在内部作用域里。接下来,我们将使用 `result``println!` 移动到内部作用域之外,就在其结束之后。注意示例 10-25 中的代码不能编译:
接下来,让我们尝试一个 `result` 的引用的生命周期肯定比两个参数的要短的例子。将 `result` 变量的声明从内部作用域中移动出来,但是`result``string2` 变量的赋值语句一同放在内部作用域里。接下来,我们将使用 `result``println!` 移动到内部作用域之外,就在其结束之后。注意示例 10-25 中的代码不能编译:
<span class="filename">文件名: src/main.rs</span>

Loading…
Cancel
Save