Merge pull request #594 from Rustln/main

Add closure move sample.
pull/599/head
Sunface 3 years ago committed by GitHub
commit f2d21931ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -220,7 +220,7 @@ let add_one_v3 = |x| { x + 1 };
let add_one_v4 = |x| x + 1 ;
```
可以看出第一行的函数和后面的闭包其实在形式上是非常接近的,同时三种不同的闭包也展示了三种不同的使用方式:省略参数、返回值和花括号对。
可以看出第一行的函数和后面的闭包其实在形式上是非常接近的,同时三种不同的闭包也展示了三种不同的使用方式:省略参数、返回值类型和花括号对。
虽然类型推导很好用,但是它不是泛型,**当编译器推导出一种类型后,它就会一直使用该类型**
@ -421,6 +421,15 @@ false
如果你想强制闭包取得捕获变量的所有权,可以在参数列表前添加 `move` 关键字,这种用法通常用于闭包的生命周期大于捕获变量的生命周期时,例如将闭包返回或移入其他线程。
```rust
use std::thread;
let v = vec![1, 2, 3];
let handle = thread::spawn(move || {
println!("Here's a vector: {:?}", v);
});
handle.join().unwrap();
```
2. `FnMut`,它以可变借用的方式捕获了环境中的值,因此可以修改该值:
```rust

@ -110,7 +110,7 @@ type Meters = u32
**类型别名并不是一个独立的全新的类型,而是某一个类型的别名**,因此编译器依然会把 `Meters``u32` 来使用:
```rust
type Meters = i32;
type Meters = u32;
let x: u32 = 5;
let y: Meters = 5;

@ -139,6 +139,7 @@ fn main() {
但是上面的代码有个问题,你需要为每个枚举成员都实现一个转换分支,非常麻烦。好在可以使用宏来简化,自动根据枚举的定义来实现`TryFrom`特征:
```rust
#[macro_export]
macro_rules! back_to_enum {
($(#[$meta:meta])* $vis:vis enum $name:ident {
$($(#[$vmeta:meta])* $vname:ident $(= $val:expr)?,)*
@ -174,7 +175,7 @@ back_to_enum! {
**这个方法原则上并不推荐,但是有其存在的意义,如果要使用,你需要清晰的知道自己为什么使用**。
在之前的类型转换章节,我们提到过非常邪恶的[`transmute`转换](<../basic/converse.md#(Transmutes)>),其实,当你知道数值一定不会超过枚举的范围时(例如枚举成员对应 123传入的整数也在这个范围内),就可以使用这个方法完成变形。
在之前的类型转换章节,我们提到过非常邪恶的[`transmute`转换](../../basic/converse.md#变形记transmutes),其实,当你知道数值一定不会超过枚举的范围时(例如枚举成员对应 123传入的整数也在这个范围内),就可以使用这个方法完成变形。
> 最好使用#[repr(..)]来控制底层类型的大小,免得本来需要 i32结果传入 i64最终内存无法对齐产生奇怪的结果

Loading…
Cancel
Save