diff --git a/src/advance/functional-programing/closure.md b/src/advance/functional-programing/closure.md index be2b6447..4563e46d 100644 --- a/src/advance/functional-programing/closure.md +++ b/src/advance/functional-programing/closure.md @@ -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 diff --git a/src/advance/into-types/custom-type.md b/src/advance/into-types/custom-type.md index 09700815..b837a1a8 100644 --- a/src/advance/into-types/custom-type.md +++ b/src/advance/into-types/custom-type.md @@ -110,7 +110,7 @@ type Meters = u32 **类型别名并不是一个独立的全新的类型,而是某一个类型的别名**,因此编译器依然会把 `Meters` 当 `u32` 来使用: ```rust -type Meters = i32; +type Meters = u32; let x: u32 = 5; let y: Meters = 5; diff --git a/src/advance/into-types/enum-int.md b/src/advance/into-types/enum-int.md index f9e924a8..251924cb 100644 --- a/src/advance/into-types/enum-int.md +++ b/src/advance/into-types/enum-int.md @@ -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)>),其实,当你知道数值一定不会超过枚举的范围时(例如枚举成员对应 1,2,3,传入的整数也在这个范围内),就可以使用这个方法完成变形。 +在之前的类型转换章节,我们提到过非常邪恶的[`transmute`转换](../../basic/converse.md#变形记transmutes),其实,当你知道数值一定不会超过枚举的范围时(例如枚举成员对应 1,2,3,传入的整数也在这个范围内),就可以使用这个方法完成变形。 > 最好使用#[repr(..)]来控制底层类型的大小,免得本来需要 i32,结果传入 i64,最终内存无法对齐,产生奇怪的结果