zhanghandong / tao-of-rust-codes Goto Github PK
View Code? Open in Web Editor NEW《Rust编程之道》随书源码
Home Page: https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
License: MIT License
《Rust编程之道》随书源码
Home Page: https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
License: MIT License
像不像一个细菌?
锈菌是一种真菌,而真菌是真核生物,细菌是原核生物。实际上,真菌和动物的亲缘关系比他们和植物的更加接近。
在印刷第二版中需要新增Option问号语法示例
fn foo(x: Option<i32>) -> Option<u32> {
Some(x?.abs() as u32)
}
在返回类型为Option的情况下使用?
社区消息显示Rust 2018 edition首个正式版本rust 1.31将于12.6发布。
相对于Rust 2015 edition,编译器的使用和语言特性均有不小变化,本书是否有计划跟进Rust 2018 edition,还是准备在第二版中在进行跟进,谢谢!
我目前只看到第三章,不知道这个建议有没有在后面章节做了。
MIR 一定程度上表示了 “源代码在编译器眼中是什么样子的”。所以我为了查看 MIR,找了很久,最后才(只)知道可以通过 https://play.rust-lang.org 来查看。
我认为了解 MIR ,这种从编译器的视角去看代码的方式,能帮助我们更深刻地了解 Rust 的心智模型。所以建议书中介绍一下,怎么查看 MIR。
另外,在 P37 中介绍枚举体 “这样的枚举值本质上属于函数指针类型”。我第一次知道这个知识点时是有点震惊的,而如果能此时够贴上相应的 MIR,相信更能解释这个知识点。
如果在这个知识点下面,再继续普及一下 constructors-as-functions ,就更好了。
#![no_std]
fn main() {
println!("Hello, world!"); // 此行代码应去掉或换一个例子
//因为println!宏是std包提供的,不能在no_std上下文使用
}
C:\Users\洛佳>rustc -V
rustc 1.33.0-nightly (9eac38634 2018-12-31)
Compiling playground v0.0.1 (/playground)
error: cannot find macro `println!` in this scope
--> src/main.rs:3:5
|
3 | println!("Hello, world!");
| ^^^^^^^
error: aborting due to previous error
error: Could not compile `playground`.
To learn more, run the command again with --verbose.
跟进Rust异步开发进展,为第二版修改做铺垫。
除非使用#[no_std]属性明确指明不需要标准库,应为#![no_std]
现在书中漏了一个知识点:inner attributes和 outer attributes
参考 https://doc.rust-lang.org/reference/attributes.html
考虑在第二版中补齐。
阅读过程中的一些建议和疑问:
20页
介绍 CTFE 部分,不用提 const generics 部分。因为既然还在实现,另外读者也刚接触 Rust,对 impl 那个代码片段会一脸懵逼。
21 页
闭包作为参数部分,建议放到后面闭包的章节,因为对于刚接触的新手来说还未读到类型及范型,这样的代码示例也会稍难理解。
23 页
while_true 返回『单元值』,这个新手会不太好理解,而且后来的类型部分也未介绍单元值,其实对于之前未接触过类型安全型语言的朋友应该是不太好理解,这一特殊类型。我虽然知道是 '()',但是之前不清楚原来这在中文中叫作"单元值"。
代码清单 3-41 的 29 行后缺少 main
函数声明
…… 那么,结构体(Enum)或联合体(Union)是被分配在哪的呢?
应为
…… 那么,结构体(Struct)、枚举(Enum)和联合体(Union)又是被分配在哪的呢?
下面还有同样的误植
RAII
被写成了RAI
"\n" 应改为 "\0"
书中Cargo.toml
应该统一首字母大写,现在还有cargo.toml
的情况。
原文:
在进一步学习之前,我们有必要了解一下Rust 代码是如何执行的。Rust 是跨平台语言,
一次编译,到处运行,这得益于LLVM。Rust 编译器是一个LLVM 编译前端,它将代码编译
为LLVM IR,然后经过LLVM 编译为相应的平台目标。
说的好像Java一样。。重新考虑一下描述
第一章讲实践性的时候,提到“世界暂停”,有些读者可能不太明白这个意思。所以需要加个注解。
注:在几乎所有的GC实现中,都需要一个短暂的“整个程序世界暂停”阶段来扫描堆栈上的引用,以便安全地回收内存。
因为 4.1
节中讲述的大量内容仅适用于 x86 平台,建议添加“以下以 x86 为例,简单的说明通用处理器平台的虚拟内存系统”等字样,以免混淆(MIPS 的虚拟地址空间管理很不相同;其他 ISA 中也不存在 ESP / EBP 这样的寄存器;等等)
在代码清单 9-39 中,通过 From 为 Error 实现转换到 std::io::Error 和 std::num::ParseIntError
不知道是不是我理解有问题, 我觉得应该是 通过为Error实现From,将std::io::Error和std::num::ParseIntError转换为Error
, 这样看起来更通顺。
看完了第九章的样章,张老师写得很好,书已经下单。
ps:也感谢张老师的Rust每日新闻频道,收获很多。
通过
as
将T
类型中的不可变借用先转换为* counst T
此处应为 * const
&str 存储与栈上,str 字符串存储与堆上。
建议增加一个注释说明 str 还有可能存储于程序的静态只读数据区内。
比如有个函数foo
fn foo(a: &[u8]) -> u32 {
a[0] as u32 +
(a[1] as u32 << 8) +
(a[2] as u32 << 16) +
(a[3] as u32 << 24)
}
这个函数如果你去翻汇编代码的话会发现它有四次unwrap判断(来自slice的直接索引)
然而你如果在这个函数开头加上 assert(a.len() >= 4)
就会变成只有一次检查了
考虑是否新增到第二版印刷中
不过, Rust 提供了另外一个智能指针
RefCell<T>
…
RefCell<T>
不是智能指针,其内部的占用标记与 T
的数据是存放在一起的,详情可参见 Rust Container Cheatsheet
从Rust Quiz中汲取到很多东西,计划融入到书的内容中去。
图中箭头由堆指向栈,我感觉应该反过来,由栈指向堆
"代码清单5-10中..."
应改为
"代码清单5-12中..."
书中在这里讲到 let other_fn = hello; 这里的类型是fn() {hello} 是这个函数本身的类型而不是函数指针类型, 后面还说到, “传入sum和product函数名之后, 会自动通过模式匹配转换为函数指针类型”
读到这里的时候, 有点不太理解 “函数本身的类型” 和 函数指针类型在rust内的具体区别, 以及, 是哪个trait/语言特性导致了 函数类型和函数指针的相互转换?
函数调用的时候如果传入一个函数名, 到底传入的是什么? 这里的细节还希望作者可以能多深入写两句. 因为写了函数本身的类型后, 我读后面的内容老是会纠结这两个概念在每个地方实际上是什么样子的.
仅仅是个人建议~
ertern块
应为extern块
全面清点书中函数指针类型和函数项类型描述不清楚的地方。
使用cargo new 命令默认创建的是库文件(生成静态或动态链接库),它并非可执行文件,而是专门用于被其他应用程序共享的功能模块。如果想创建可执行文件,那么需要使用--bin参数。
现版本cargo new命令默认创建可执行文件,如果想创建库文件,需要使用--lib参数。
len
方法中的&self
实际上是self: &self
的简写
此处应为 self: &Self
from: 过客whhema
在 2.6.3
节 字符类型
中,可在介绍 Rust 的 char
类型的同时,也同时介绍 Rust 的源代码文件 .rs
文件的默认文本编码格式为 utf-8
,且不支持其他文本编码格式
暂无
let a = "hello"; // 此处应该是hello world
from 过客whhema
Steve今天已经从Rust团队离职。感谢他为我的书作序。
Steve今天在他的博客上宣布离开Mozilla。Steve说自己喜欢Rust,认为它是这个世界需要的语言,他愿意花自己的精力去推广。但可能在Mozilla工作这么多年,积累了很多委屈,让他越来越沮丧。而且最近,他发现自己在Rust团队的工资是最低的,当他试图表达自己的委屈时,却受到了纪律处分。所以,造成了这次离职。
Steve在Mozilla工作了大概6年,为Rust的推广做了很多工作,祝愿他一切顺利。Read More
来自Gabin
版权归作者所有,任何形式转载请联系作者。
作者:gabin(来自豆瓣)
来源:https://book.douban.com/review/9884812/。从普遍性到特殊性的讲解过程,有时候读起来也费事。比如,3.3节(page 60)讲解泛型的时候,一开始就给出泛型的代码示例,幸好我有跳读的习惯,在读到61页的代码清单3-20的时候,才明白泛型函数经过编译后会变成多个具体类型的函数。那么按照问题求解的思路,首先我们可以先把3-20的代码写出来,然后说“两个函数仅仅是类型定义上的区别,为了这点区别就写多个函数太费事了,应该提供一种类型抽象功能,让程序员可以写一个函数就搞定”,然后再贴出3-16的代码示例。可见,从特殊到普遍也符合人类的认知发展过程。希望作者能在新版中做出这类改进,让读者能更顺畅地阅读。
将:
// 对象安全的trait,将不安全的方法拆分出去
改为:
// 对象安全的trait,将对象不安全的方法拆分出去
分别为
FutureObj
和Arc<WeakHandle>
类型
而
WeakHandle
则是用来唤醒任务的句柄
此处应为 WakeHandle
图中显示 trait object 的 vtable 被存放在堆中,但这是错误的:vtable 一般放在程序的静态只读数据区中,而非堆中
第 3.1.3
节 类型系统与多态性
而 Rust 语言重并没有类似 Java 中的继承的概念,所以也不存在子类型多态。所以,Rust 中的类型系统目前只支持参数化多态和 Ad-hoc 多态,也就是,泛型和 trait 。
实际上 Rust 支持 Subtyping ,但仅限于 lifetime 带来的 Subtyping 这一种情况。基于 lifetime 的 Subtyping 直接影响了 Rust 的 Variant & Covariant 规则。
Mutex 错写作 Metux
Fn(T) -> U 在 T 上是不变,在 U 上是协变。
按照 我测试的结果 ,Fn
在 T
上应该是逆变的。
同理,第 494 页第二行,“普通的函数调用,参数是不变”,但实际上也是逆变的:一个类型为 &'a str
的形参永远可以传一个 &'static str
的实参进去。
PS:感觉这里实际上应该用 fn(T) -> U
? fn
类型比 Fn
trait 更加基础重要一些。
PS2:493 页就写了 PhantomData<fn(T)>
在 T
上是逆变 😂
RwLock 错误拼写为 RewLock。
代码清单 12-11 中的 lisp 代码额外多了第 6 行的括号
然后修改 mian.rs 文件
此处应为 main.rs
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.