└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # rust_book_feedback 2 | 3 | 这个项目用于记录《深入浅出Rust》的勘误以及读者反馈。深入浅出Rust读者交流群 497531779。 4 | 5 | ## 勘误表 6 | 7 | * P8 8 | 9 | 代码 `use std::prelude::*;` 应改为 `use std::prelude::v1::*;` 10 | 11 | * P18 12 | 13 | 第三块代码中 14 | ```rust 15 | let var6 = 12usize; // i6变量是usize类型 16 | let var7 = 0x_ff_u8; // i7变量是u8类型 17 | ``` 18 | 注释应该分别为 `var6` 变量和 `var7` 变量: 19 | ```rust 20 | let var6 = 12usize; // var6变量是usize类型 21 | let var7 = 0x_ff_u8; // var7变量是u8类型 22 | ``` 23 | 24 | * P27 25 | 26 | tuple、struct、struct tuple 起的作用都是把几个不同类型的成员打包组合成一个类型 27 | 28 | 应改为 29 | 30 | tuple、struct、tuple struct 起的作用都是把几个不同类型的成员打包组合成一个类型 31 | 32 | * P39 33 | 34 | `fn func(i: i32) -> bool` 函数函数签名和函数体类型不匹配,函数参数名字与内部变量名字也不匹配。可以修正为以下代码: 35 | 36 | ```rust 37 | fn func(i: i32) -> std::cmp::Ordering { 38 | if i < 0 { 39 | std::cmp::Ordering::Less 40 | } else if i > 0 { 41 | std::cmp::Ordering::Greater 42 | } else { 43 | std::cmp::Ordering::Equal 44 | } 45 | } 46 | ``` 47 | 48 | * P41 49 | 50 | 最下面那段代码,`println!("{}", v);`应该改为`println!("{:?}", v);`: 51 | ```rust 52 | fn main() { 53 | let v = loop{}; 54 | println!("{:?}", v); 55 | } 56 | ``` 57 | 58 | * P48 59 | 60 | 这个函数的返回类型可以是任何一个满足 Termination trait 约束的类型,其中 `()`、bool、Result 都是满足这个约束的 61 | 62 | 应改为 63 | 64 | 这个函数的返回类型可以是任何一个满足 Termination trait 约束的类型,比如 `()`、`Result<(), E>` 等类型就是满足这个约束的 65 | 66 | * P89 67 | 68 | 倒数第二段代码,`while let` 应该改为 `if let`: 69 | ```rust 70 | if let A(x) | B(x) = expr { 71 | do_something(x); 72 | } 73 | ``` 74 | 75 | * P159 76 | 77 | 代码中的 `vdata.set(10);` 应改为 `data.set(10);` 78 | 79 | * P161 80 | 81 | 绝对不可能让用户有机会通过 `&Cetl` 获得 `&T` 或者 `&mut T` 82 | 83 | 其中,`&Cetl` 应改为 `&Cell` 84 | 85 | * P187 86 | 87 | ……避免了Arc的运行效率损失, 是非常有用的scoped函数与spawn函数的区别就在于…… 88 | 89 | 应改为 90 | 91 | ……避免了Arc的运行效率损失, 是非常有用的。scoped函数与spawn函数的区别就在于…… 92 | 93 | 本页最后一句,只要用户有可能在不使用 unsafe 构造出内存安全 94 | 95 | 应改为 96 | 97 | 只要用户有可能在不使用 unsafe 时构造出内存不安全 98 | 99 | * P210 100 | 101 | 究竟准是准的子类型 102 | 103 | 应改为 104 | 105 | 究竟谁是谁的子类型 106 | 107 | * P211 108 | 109 | 类型 `fn(T)->U` 对于泛型参数`T`具备协变关系 110 | 111 | 应改为 112 | 113 | 类型 `fn(T)->U` 对于泛型参数`T`具备逆变关系 114 | 115 | 类型 `fn(T)->U` 对于泛型参数`U`具备逆变关系 116 | 117 | 应改为 118 | 119 | 类型 `fn(T)->U` 对于泛型参数`T`具备协变关系 120 | 121 | * P212 122 | 123 | `PhantomData<'aT>` 应该改为 `PhantomData<&'a T>` 124 | 125 | * P257 126 | 127 | 其次尝试选择 `fn call_mut(&self, args:Args)` 128 | 129 | 应改为 130 | 131 | 其次尝试选择 `fn call_mut(&mut self, args:Args)` 132 | 133 | * P279 134 | 135 | 图片内箭头指向位置错乱了 136 | 137 | * P298 138 | 139 | 由于Rust设计的改变,跟 `PinMut` 有关的都需要改一下。具体包括 140 | 141 | `PinMut<'a, T>` 应改为 `Pin

` 142 | 143 | `self: PinMut` 应改为 `self: Pin<&mut Self>` 144 | 145 | `PinMut` 应改为 `Pin<&mut XXGenerator>` 146 | 147 | `PinMut` 应改为 `Pin` 148 | 149 | * P299 150 | 151 | 最上面的代码块中 152 | ```rust 153 | fn poll(self: PinMut, cx: &mut Context) -> Poll 154 | ``` 155 | 应改为: 156 | ```rust 157 | fn poll(self: Pin<&mut Self>, lw: &LocalWaker) -> Poll 158 | ``` 159 | 160 | 倒数第六行,`PinMut` 应改为 `Pin<&mut Self>` 161 | 162 | 倒数第五行,`PinMut` 应改为 `Pin` 163 | 164 | * P300 165 | 166 | 第2行和第3行,`PinMut` 改为 `Pin<&mut T>`。 167 | --------------------------------------------------------------------------------