ZhangHanDong / tao-of-rust-codes

《Rust编程之道》随书源码
https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
MIT License
1.19k stars 170 forks source link

[第二章]勘误以及一些疑问 #66

Closed yim7 closed 5 years ago

yim7 commented 5 years ago

页码与行数


文本或排版错误

在 Rust 2018 版本的首个语义化版本应该是 1.31


页码与行数

代码规范

这里匹配多种模式,5 前面不应该有或运算符,因为它前面没有其它模式

match number {
...
| 5 | 7 | 13 => ...
...
}

页码与行数

描述不准确

您把基本数字类型分为三种:固定大小的类型、动态大小的类型、浮点数。 usize、isize 依赖于机器的架构,说是动态类型长度似乎并不合理,如果按照这么分,浮点数也是固定大小类型,c语言里所有的整型都是动态大小的类型了,和我们一般理解的动态大小类型的概念 “不能在编译时确定类型大小”不一致

页码和行数

切片和引用的概念混杂使用

比如 11行, “通过引用操作符&对数组进行引用,就产生了一个切片&arr”, 2.6.7 第一行 “rust 提供了原始的字符串类型 str,也叫做字符串切片” 我觉得既然切片和引用的类型不一样,混淆使用这两个可能会对新手造成困扰

页码和行数

没有提到 struct variant enum(不知道如何翻译)

rust book 有提到这种枚举(但是没提类c枚举体,是不建议这种用法吗?),和您书里的携带类型参数的枚举不一样(看到本质上属于函数指针类型感觉很神奇)

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

页码和行数

文本或排版错误

正确的应该是 &Option<String> 类型的绑定s

页码和行数

文档代码示例缺失

fn map_demo() 是私有函数

页码和行数

代码错误,不能运行

修改,一处是第9行变量名错误,一处是assert_eq!需要实现Debug

fn main() {
    #[derive(PartialEq, Debug)]
    struct Point {
        x: f64,
        y: f64,
    }
    // 将Point实例装箱(放到堆内存)
    let boxed_point = Box::new(Point { x: 0.0, y: 0.0 });
    let unboxed_point: Point = *boxed_point; // 通过解引用操作符取出Point实例
    assert_eq!(unboxed_point, Point { x: 0.0, y: 0.0 });
}
ZhangHanDong commented 5 years ago

@yim7 感谢反馈。

  1. 「首个语义化版本」,可能是手滑写错了,在第一章我介绍是「1.31」,这个地方第三次印刷修复。
  2. 模式匹配的示例问题,这个也需要修正。
  3. 对于数字类型的描述,我再继续斟酌一下,第三次印刷的时候换个更好的描述。
  4. “rust 提供了原始的字符串类型 str,也叫做字符串切片” 这个描述有待改善,确实有点表意不清,不过后面具体章节有更深入的介绍。
  5. 这是一个内容组织问题。第二章的目的,不是让你学习全部语法。第二章的目的,我在开篇头两段已经写清楚了。 你提到缺少的语法,建议继续往后面看,后面具体章节有描述。第二章只是精要介绍。 不过「函数指针」那个不太精准,后续也打算修正,可以参考我这篇文章:《Rust编程之道》读者答疑精选:函数项类型和函数指针类型
  6. 后面的代码问题,建议以随书源码为准。随书源码我都跑过一遍。你提到的书里代码问题,我会排查,第三次印刷修改。
mzji commented 5 years ago
match number {
...
| 5 | 7 | 13 => ...
...
}

这前面可以写 | 是语法特例,最前面的 | 没有任何作用

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

它的本质还是 enum ,不是函数指针……只是它的 EnumName::VariantName 可以当作构造器来用

ZhangHanDong commented 5 years ago

@mzji 嗯,这个说法要在后面修正。 是我理解有误。上面那篇文章,深度挖掘了一下。后面希望精简到书里面,修正这个问题。

ZhangHanDong commented 5 years ago

@yim7

[map_demo是私有函数 ]

我搜索全书也没发现这个函数。

yim7 commented 5 years ago

@yim7

[map_demo是私有函数 ]

我搜索全书也没发现这个函数。

抱歉,是我表述不清楚,不是书上的问题! hashmap 示例在在线文档里没有生成 https://github.com/ZhangHanDong/tao-of-rust-codes/blob/master/src/ch02/collections.rs https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/ch02/collections/index.html

ZhangHanDong commented 5 years ago

@yim7 好的,感谢回复。