Merge pull request #11 from sunface/main

sync
pull/833/head
Rustln 3 years ago committed by GitHub
commit 21929f0840
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -7,7 +7,7 @@
---
[Rust 语言中文网](community.md)
[一本生锈的书](rusty-book.md)
[Rust 语言周刊](rust-weekly.md)
[Rust 语言周刊第 9 期](rust-weekly.md)
[Rust 翻译计划( 代号 Rustt )](rustt.md)
# 快速开始

@ -582,7 +582,8 @@ impl Future for Delay {
} else {
// 计时尚未结束Future 还未完成,因此返回 `Poll::Pending`.
//
// `Future` 特征要求当 `Pending` 被返回时,那我们要确保当资源准备好时,必须调用 `waker` 以通/// 知执行器。 在我们的例子中,会通过生成的计时线程来保证
// `Future` 特征要求当 `Pending` 被返回时,那我们要确保当资源准备好时,必须调用 `waker` 以通
// 知执行器。 在我们的例子中,会通过生成的计时线程来保证
//
// 如果忘记调用 waker 那等待我们的将是深渊:该任务将被永远的挂起,无法再执行
Poll::Pending

@ -87,6 +87,21 @@ fn main() {
该语句块是表达式的原因是:它的最后一行是表达式,返回了 `x + 1` 的值,注意 `x + 1` 不能以分号结尾,否则就会从表达式变成语句, **表达式不能包含分号**。这一点非常重要,一旦你在表达式后加上分号,它就会变成一条语句,再也**不会**返回一个值,请牢记!
最后,表达式如果不返回任何值,会隐式地返回一个 [`()`](https://course.rs/basic/base-type/char-bool.html#单元类型) 。
```rust
fn main() {
assert_eq!(ret_unit_type(), ())
}
fn ret_unit_type() {
let x = 1;
// if 语句块也是一个表达式,因此可以用于赋值,也可以直接返回
if (x > 1) {
}
}
```
## 课后练习

@ -75,8 +75,10 @@ int* foo() {
理解了堆栈,接下来看一下*关于所有权的规则*,首先请谨记以下规则:
> 1. Rust 中每一个值都 `有且只有` 一个所有者(变量)
> 2. 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
> 1. Rust 中每一个值都被一个变量所拥有,该变量被称之为值的所有者
> 2. 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者
> 3. 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
#### 变量作用域
@ -194,8 +196,9 @@ error[E0382]: use of moved value: `s1`
现在再回头看看之前的规则,相信大家已经有了更深刻的理解:
> 1. Rust 中每一个值都 `有且只有` 一个所有者(变量)
> 2. 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
> 1. Rust 中每一个值都被一个变量所拥有,该变量被称之为值的所有者
> 2. 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者
> 3. 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
如果你在其他语言中听说过术语 **浅拷贝(shallow copy)** 和 **深拷贝(deep copy)**,那么拷贝指针、长度和容量而不拷贝数据听起来就像浅拷贝,但是又因为 Rust 同时使第一个变量 `s1` 无效了,因此这个操作被称为 **移动(move)**,而不是浅拷贝。上面的例子可以解读为 `s1` 被**移动**到了 `s2` 中。那么具体发生了什么,用一张图简单说明:

@ -43,23 +43,23 @@
* ORM
* [rbatis/rbatis](https://github.com/rbatis/rbatis) 国内团队开发的ORM异步、性能高、简单易上手
* [diesel-rs/diesel](https://github.com/diesel-rs/diesel) 安全、扩展性强的Rust ORM库支持`Mysql`、`Postgre`、`SqlLite`
* [diesel-rs/diesel](https://github.com/diesel-rs/diesel) 安全、扩展性强的Rust ORM库支持`MySQL`、`PostgreSQL`、`SQLLite`
* MySQL
* [blackbeam/rust-mysql-simple](https://github.com/blackbeam/rust-mysql-simple) 纯Rust实现的Mysql驱动,提供连接池
* [blackbeam/mysql_async](https://github.com/blackbeam/mysql_async) 基于Tokio实现的异步Mysql驱动
* [blackbeam/rust-mysql-simple](https://github.com/blackbeam/rust-mysql-simple) 纯Rust实现的MySQL驱动,提供连接池
* [blackbeam/mysql_async](https://github.com/blackbeam/mysql_async) 基于Tokio实现的异步MySQL驱动
* 上面两个都是一个团队出品前者文档更全、star更多建议使用前者
* PostgreSQL
* [sfackler/rust-postgres](https://github.com/sfackler/rust-postgres) 纯Rust实现的Postgre客户端
* [sfackler/rust-postgres](https://github.com/sfackler/rust-postgres) 纯Rust实现的PostgreSQL客户端
* SQLite
* [rusqlite](https://github.com/rusqlite/rusqlite) 用于[Sqlite3](https://www.sqlite.org/index.html)的Rust客户端
### NoSql客户端
### NoSQL客户端
* Redis
* [mitsuhiko/redis-rs](https://github.com/mitsuhiko/redis-rs) 虽然最近更新不太活跃,但是它依然是最好的redis客户端说实话我期待更好的可能这也是Rust生态的未来可期之处吧
* [mitsuhiko/redis-rs](https://github.com/mitsuhiko/redis-rs) 虽然最近更新不太活跃,但是它依然是最好的Redis客户端说实话我期待更好的可能这也是Rust生态的未来可期之处吧
* Canssandra
* [krojew/cdrs-tokio](https://github.com/krojew/cdrs-tokio) [[cdrs-tokio](https://crates.io/crates/cdrs-tokio)] 生产可用的Cassandra客户端异步、纯Rust实现就是个人项目 + star较少未来不确定会不会不维护
@ -70,12 +70,14 @@
### 分布式
#### 服务发现
- [luncj/etcd-rs](https://github.com/luncj/etcd-rs) 异步实现的Rust etcd客户端优点是有一定的文档、作者较为活跃,意味着你提问题他可能会回答不过如果你不放心还是考虑使用HTTP的方式访问ETCD
- [luncj/etcd-rs](https://github.com/luncj/etcd-rs) 异步实现的Rust etcd客户端优点是有一定的文档、作者较为活跃,意味着你提问题他可能会回答不过如果你不放心还是考虑使用HTTP的方式访问etcd
#### 消息队列
* Kafka
* [fede1024/rust-rdkafka](https://github.com/fede1024/rust-rdkafka) Rust Kafka客户端基于C版本的Kafka库[librdkafka]实现,文档较全、功能较为全面
* [kafka-rust/kafka-rust](https://github.com/kafka-rust/kafka-rust) 相比上一个库它算是纯Rust实现文档还行支持Kafka0.8.2及以后的版本但是对于部分0.9版本的特性还不支持。同时有一个问题:最初的作者不维护了,转给了现在的作者,但是感觉好像也不是很活跃
* Nats
* [nats-io/nats.rs](https://github.com/nats-io/nats.rs) Nats官方提供的客户端

@ -1,76 +1,85 @@
# 「Rust 语言周刊」 第 8 期 · 2022-04-15
# 「Rust 语言周刊」 第 9 期 · 2022-04-24
Rust语言周刊精选全世界过去一周的优秀文章、新闻、开源项目和语言动态。
本周刊由 Rust 语言中文网倾情打造,其中的 `[Zh]` 标识的中文资料由 Rust 翻译计划提供,并且原始的 Markdown 文档已[全部开源](https://github.com/rustlang-cn/rustt),欢迎大家阅读和订阅。
本周刊由 RustCn 倾情打造,其中, `[Zh]` 标识的中文资料由 Rust 翻译计划提供,并且原始的 Markdown 文档已[全部开源](https://github.com/rustlang-cn/rustt),欢迎大家阅读和订阅。
> 官方网址https://cnru.st, 公众号: Rust语言中文网
> RustCnhttps://hirust.cn, 公众号: Rust语言中文网
<img src="https://pic3.zhimg.com/80/v2-c0bc94b659686e9aa955363c492f9951_1440w.png">
<h5 align="center">题图: 开发 DNS 客户端过程中的笑与泪</h5>
<img src="https://pic3.zhimg.com/80/v2-ba5c1b119916224a45041b157f46f26c_1440w.jpeg">
<h5 align="center">题图: MnemOS</h5>
#### Rust新闻
1、[Zh] [Rust 1.60 发布](https://course.rs/appendix/rust-versions/1.60.html)
#### 开源项目
在新版中,我们可以查看 Cargo 构建时的详细耗时了,有助于分析和改善编译时间,还有就是条件编译和依赖引入了新的期待已久的功能。
1、[一个新的小型操作系统: MnemOS](https://jamesmunns.com/blog/mnemos-initial-release/)
2、[rust-analyzer 正式加入官方组织](https://www.reddit.com/r/rust/comments/u2nm0y/rustanalyzer_is_now_official_github_repo_moved_to/)
该操作系统使用 Rust 开发,适用于受限的硬件环境,例如微控制器。但是目前它的状态还比较玩具,大家想要用它来 make money ,还是洗洗睡了吧,用来学习下新的领域倒是很不错,毕竟互联网的未来..懂的都懂。
优秀的产品很难被埋没,`rust-analyzer` 就是如此,这不,现在已经正式成为了官方项目,并且很快会替代 `rls` 成为 VSCode上的默认首选插件新人有福了。
2、[著名 Rust 游戏引擎 Bevy 发布 0.7 版本](https://bevyengine.org/news/bevy-0-7/)
Bevy 的游戏引擎理念可谓是非常先进因此得到了一大票忠实的粉丝和贡献者的喜爱发展也极为迅速这次的新版本带来了大量的新特性包括骨骼动画、场景中的无限制点光源、集群渲染、材质压缩、着色器优化、ECS优化等等。
但。。。离生产可用,依然有很长的距离,大家在业余爱好上玩玩即可,毕竟哪个男孩子没有一个游戏梦呢 :P
#### 精选文章
<img src="https://pica.zhimg.com/80/v2-c9a1040d81119cf412559774cb411e51_1440w.png" />
1、[Zh] [Rust 的 unsafe 指针,到底怎么了?](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-07%5D%20Rust%20的%20unsafe%20指针类型需要大修.md)
3、[systeroid: Rust 版本的 sysctl](https://systeroid.cli.rs)
本文由 `Nomicon``Too Many Lists` 作者编写,大佬对 Rust 现有的裸指针进行了深入剖析,并给出了相应的解决方案,干货满满!
`sysctl` 大家应该都很熟悉了,但是再辉煌的英雄也终将老去,而我们的 Rust 替代者 `systeroid` 更快、更强、更安全,值得一试!
2、[Zh] [理解 Rust 的借用检查器](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-07%5D%20理解%20Rust%20的借用检查器.md)
<img src="https://pic2.zhimg.com/80/v2-95002dd3324691764cb727bedb34308d_1440w.gif" />
每当你心潮澎湃想要写一些 Rust 代码时,可能最后都会败给借用检查器。
3、[Zh] [使用 Rust 构建自己的区块链平台](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-07%5D%20使用%20Rust%20和%20Substrate%20构建自己的区块链平台.md)
#### 精选文章
本文将基于著名的 [Substrate](https://substrate.io) 区块链框架来构建一个区块链平台:一个博客后端,用户可以在此提交博客文章、发表评论等。
1、[Zh] [用 Rust 加速你的 Python 代码](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-13%5D%20从python调用rust-使用rust加速你的python代码.md)
4、[Zh] [由 Java/C#/C/C++ 开发者转为 Rustacean](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-02%5D%20由%20Java:C%23:C:C%2B%2B%20开发者转为%20Rustacean.md)
Python 的广袤天空只存在一个限制,那就是性能,以往都是通过 C/C++ 来增强,现在我们还能使用 Rust 来实现。
从题目能看出,作者是一个爱秀肌肉的多面手,对了,他还在写一本生命周期的书,值得期待!
2、[Zh] [异步 Rust: 协作与抢占式调度](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-12%5D%20异步%20Rust协作与抢占式调度.md)
5、[开发 DNS 客户端过程中的笑与泪](https://blog.adamchalmers.com/making-a-dns-client/)
多线程往往用来并行执行计算密集型任务但是时代变了现在越来越多的程序是I/O 密集型,此时就需要 `async` 来大展身手了。
看看下面这张图,你是否被勾引起开发一个 DNS 客户端的兴趣?反正作者是的。
3、[Zh] [如何用 Rust 实现朴素贝叶斯分类器](https://zhuanlan.zhihu.com/p/501337745)
<img src="https://pic3.zhimg.com/80/v2-c0bc94b659686e9aa955363c492f9951_1440w.png" />
难度高能预警,实力干货满满!
6、[生命苦短,我选择与编译检查搏斗?](https://kerkour.com/life-is-short-rust-borrow-checker)
4、[Zh] [Ruby 的新 YJIT 编译器已完成,使用 Rust 重新实现](https://zhuanlan.zhihu.com/p/502298810)
本文很短,短到令人震惊,但是确实很好的吐槽了为了对付 Rust 编译检查,我们需要付出的努力
去年 12 月时Ruby 开始将 YJIT 代码库从 C99 移植到 Rust 上,这周,负责此项目的开发者表示已经完成新编译器的实现,等待合并
7、[默认值和类型推断:使用表达式来替代类型](https://gankra.github.io/blah/defaults-affect-inference/)
难道说,使用 Rust 重写各个语言的基础层和工具已经成为了新的潮流?
你是否注意过 Rust 中的集合类型存在一些奇怪的约束条件?这种奇怪已经存在很久了,甚至在 1.0 版本前就有,本文试图解释下相关的问题并且尝试使用一种新的方法去解决。
5、[危! C/C++ 的嵌入式!](https://apollolabsblog.hashnode.dev/why-you-should-be-worried-about-the-future-of-cc-in-embedded-a-case-for-rust)
8、[隐性约束和完美派生](https://smallcultfollowing.com/babysteps/blog/2022/04/12/implied-bounds-and-perfect-derive/)
对于嵌入式环境而言,软件的错误和失败太正常不过了,你问我罪魁祸首是谁?嗯,我不知道 🤪,但是我知道未来的救世主可能会是谁。
在 Rust 社区中有两个问题已经被讨论很久了完美派生以及可扩展的隐性约束但是最近Rust 团队在实现它们时遇到了一些问题,一起来看看。
6、[连续性和包级别的 Where 语句](https://smallcultfollowing.com/babysteps/blog/2022/04/17/coherence-and-crate-level-where-clauses/)
大佬的硬核文章又来了。这次带来的是对 Rust 中[孤儿原则](https://course.rs/basic/trait/trait.html#特征定义与实现的位置孤儿规则)的深入分析,曾经大放异彩的它随着时间的逐步推移,却成了包组合的障碍( 通过组合的方式来使用多个包 )。
9、[系列] [指针很复杂 III](https://www.ralfj.de/blog/2022/04/11/provenance-exposed.html)
7、[Hack rustc: 为特征实现异步函数](https://blog.theincredibleholk.org/blog/2022/04/18/how-async-functions-in-traits-could-work-in-rustc/)
作者目前的工作需要处理 Rust/MIR 的内存模型,因此会触及到普通开发不太熟悉的领域,系列的文章第一篇见[这里](https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html)
目前 Rust 异步工作组的一个重要工作就是让 `async fn` 能在所有 `fn` 出现的地方使用,当然,最受大家关注的,应该就是在特征中使用异步函数了。本文将从 Rustc 的角度出发,来讲解异步函数该如何在特征中实现
10、[使用 Rust 构建爬虫](https://kerkour.com/rust-crawler-associated-types)
8、[该如何选择合适的整数类型?](https://www.thecodedmessage.com/posts/programming-integers/)
本文节选自 `Black Hat Rust`,在文中,作者清晰的解释了 `scraper``crawler` 的区别,以及介绍了 Rust 为何非常适合爬虫的原因。
> i8 - i64, u8 - u64我该如何选择
这个问题在国内外各个论坛屡见不鲜,事实上,要正确的回答它,是想当困难的,而本文就是从实践的角度出发,给出该如何选择的建议。
#### 开源项目
9、[使用 MacOS 下的 MetaAPI 来构建一个全新的终端](https://console.dev/interviews/warp-zach-lloyd/)
聪明的同学可能已经想到,使用 Rust 开发的、MacOS 下的新终端?这会不会是刚融资了几千万美元的 Warp ? Bingo你猜对了本文正式对 Warp 的独家采访
10、[为何 Rust 在嵌入式这么受欢迎?](https://tweedegolf.nl/en/blog/70/we-asked-5-people-why-they-like-embedded-rust)
文章采访了 5 位不同的大佬,通过他们的观点,我们可以看出 Rust 为啥在嵌入式领域越来越火了。
1、[fdb - 基于 Tokio 的 FoundationDB 客户端驱动](https://github.com/fdb-rs/fdb)
11、[编译期的求值: Nim, Zig, Rust and C++](https://castillodel.github.io/compile-time-evaluation/)
FoundationDB 于数年前被苹果收购,并且服务于生产环境多年,是一个非常可靠、非常非常有特色的分布式数据库。
编译期求值,对于计算性能优化来说是非常重要的,本文将从多门语言的角度出发,看看编译期求值到底是个什么东东
2、[ogma - 用于处理表格化数据的脚本语言](https://github.com/kdr-aus/ogma)
12、[在 10 分钟之内构建并部署一个短域名服务](https://www.shuttle.rs/blog/2022/03/13/url-shortener)
<img src="https://github.com/kdr-aus/ogma/raw/main/docs/assets/common-cmds.filter.gif?raw=true" />
大佬的世界总是与众不同的,这不,作者发现自己失眠后,出于对睡眠不足的恐惧,决定要挑战下自己...

@ -29,7 +29,7 @@ Rust 是一门完全开源的语言,在 2015 年发布了 1.0 版本,但是
当然,还能从能源本身入手来改善,例如 AWS 计划在 2025 年之前实现所有数据中心都使用可再生能源,但可再生能源并不意味着它没有环境影响,它依然需要 50 万英亩的太阳能板来生成 200 太瓦时的数据中心能源需求。总之,可再生能源不是一个设计上的概念,也不能替代设计上的优化,我们还需要其它方式。
这些其它方式包括:为非关键服务放松 `SLA` 的要求和资源供给优先级,利用虚拟化实现更长的设备升级周期,更多利用缓存、设置更长的 TTL ,对数据进行分类并通过自动化的策略来实现尽可能及时的数据删除,为加密和压缩选择更高效的算法等等,最后但也最重要的是:**我们可以选择使用一门能源效率高的编程语言来实现基础服务和用户端的软件**。
这些其它方式包括:为非关键服务放松 `SLA` 的要求和资源供给优先级,利用虚拟化实现更长的设备升级周期,更多利用缓存、设置更长的 TTL ,对数据进行分类并通过自动化的策略来实现尽可能及时的数据删除,为加密和压缩选择更高效的算法等等,最后但也最重要的是:**我们可以选择使用一门能源效率高的编程语言来实现基础服务和用户端的软件**。
## 编程语言的能源效率
对于开发者来说,估计没几个人能搞清楚自己服务的能源效率,那么该如何对比编程语言之间的能源效率呢?好在国外有专家做了相关的[学术研究](https://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf)。

@ -1,6 +1,10 @@
# ChangeLog
记录一些值得注意的变更。
## 2022-04-23
- 发布 [Rust 周刊第 9 期](https://course.rs/rust-weekly.html)
## 2022-04-15
- 调整数值类型章节的目录结构,并新增位运算,感谢 [liCells](https://github.com/liCells) 提交的 PR

Loading…
Cancel
Save