2
0
mirror of https://github.com/gnu4cn/rust-lang-zh_CN.git synced 2025-04-02 23:50:24 +08:00

Improve Ch13

This commit is contained in:
Unisko PENG 2023-04-25 15:47:21 +08:00
parent 135d0157f7
commit 0b86b31560

View File

@ -145,7 +145,7 @@ let add_one_v4 = |x| x + 1 ;
第一行给出了函数定义,而第二行给出了完整注解过的闭包定义。在第三行,咱们移除了闭包定义的类型注解。在第四行,由于闭包的主体只有一个表达式,因此咱们移出了那对可选的花括号。这些全都是在其被调用时,会产生出同样行为的有效定义。由于 `add_one_v3``add_one_v4` 中的类型将从他们的使用中推断出来,因此这两行就要求两个被执行的闭包能被编译出来。这与 `let v = Vec::new();` 需要类型注解,或需要有某种类型的值插入到这个 `Vec`Rust 才能够推断出类型相似。
对于闭包定义,编译器将为其各个参数及其返回值,推断出某种具体类型。举个例子,下面清单 13-3 给出仅返回其接收到的、作为参数的值的一个较短闭包定义。此闭包除了这个示例外,并没有什么用处。请注意这里并未添加任何类型注解到这个定义。由于没有类型注解,这里就可以任何类型调用这个闭包,这里第一次是以 `String` 类型调用的。在随后尝试以整数调用 `example_closure` 时,就会得到一个错
对于闭包定义,编译器将为其各个参数及其返回值,推断出某种具体类型。举个例子,下面清单 13-3 给出了一个仅返回作为参数接收到的值的简短闭包定义。除这个示例外,这个闭包不是特别有用。请注意咱们没有添加任何类型注解到这个定义。由于没有类型注解,咱们可以用任何类型调用这个闭包,这里咱们第一次是以 `String` 类型调用的。若咱们随后尝试以整数调用 `example_closure` 时,就会得到一个错。
文件名:`src/main.rs`
@ -155,9 +155,9 @@ let add_one_v4 = |x| x + 1 ;
let n = example_closure(5);
```
*清单 13-3尝试以两种不同类型,调用一个类型为推断出的闭包*
*清单 13-3尝试以两种不同类型调用类型为推断出的闭包*
编译器给出如下错误:
编译器会给到我们如下错误:
```console
$ cargo run lennyp@vm-manjaro
@ -181,7 +181,7 @@ For more information about this error, try `rustc --explain E0308`.
error: could not compile `closure-example` due to previous error
```
这里第一次是以 `String` 值调用的 `example_closure`,编译器便推断出了该闭包 `x` 与返回值的类型为 `String`。这些类型随后便被锁定于 `example_closure` 中的那个闭包里了,而在接下来尝试以不同类型,使用这同样的闭包时,就得到了一个类型错误。
咱们第一次是以 `String` 值调用的 `example_closure`,编译器便推断出了该闭包 `x` 与返回值的类型为 `String`。这些类型随后便被锁定于 `example_closure` 中的那个闭包里了,而在接下来尝试以不同类型,使用这同样的闭包时,就得到了一个类型错误。
### 捕获引用抑或迁移所有权