From b67410e48218c3a9902e97e9d7072032bc9da23e Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Thu, 28 Apr 2022 13:40:24 +0800 Subject: [PATCH 01/10] fix: typo in tracing-logger --- src/logs/tracing-logger.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/logs/tracing-logger.md b/src/logs/tracing-logger.md index 71f42f9e..eb878dc0 100644 --- a/src/logs/tracing-logger.md +++ b/src/logs/tracing-logger.md @@ -1,6 +1,6 @@ # 使用 tracing 输出自定义的 Rust 日志 -在 [tracing](https://docs.rs/crate/tracing/latest) 包出来前,Rust 的日志也就 `log` 有一战之力,但是 `log` 的功能相对来说还是鸡简单一些。在大名鼎鼎的 tokio 开发团队推出 `tracing` 后,我现在坚定的认为 `tracing` 就是未来! +在 [tracing](https://docs.rs/crate/tracing/latest) 包出来前,Rust 的日志也就 `log` 有一战之力,但是 `log` 的功能相对来说还是简单一些。在大名鼎鼎的 tokio 开发团队推出 `tracing` 后,我现在坚定的认为 `tracing` 就是未来! > 截至目前,rust编译器团队、GraphQL 都在使用 tracing,而且 tokio 在密谋一件大事:基于 tracing 开发一套终端交互式 debug 工具: [console](https://github.com/tokio-rs/console)! @@ -91,7 +91,7 @@ where 从代码中可以看出,我们打印了事件中包含的事件名、日志等级以及事件发生的代码路径。运行后,可以看到以下输出: -```properties +```shell $ cargo run --example figure_1 Got event! @@ -175,7 +175,7 @@ fn on_event( ``` 这段代码看起来有模有样,来运行下试试: -```properties +```shell $ cargo run --example figure_2 Got event! @@ -267,7 +267,7 @@ fn on_event( ``` 继续运行: -```properties +```shell $ cargo run --example figure_3 { @@ -292,7 +292,7 @@ $ cargo run --example figure_3 不知道大家知道分布式追踪不?在分布式系统中每一个请求从开始到返回,会经过多个服务,这条请求路径被称为请求跟踪链路( trace ),可以看出,一条链路是由多个部分组成,我们可以简单的把其中一个部分认为是一个 span。 -跟 log 是对某个时间点的记录不同,span 记录的是一个时间段。当程序开始执行一系列任务时,span 就会开始,当这个系列任务结束后,span 也随之结束。 +跟 log 是对某个时间点的记录不同,span 记录的是一个时间段。当程序开始执行一系列任务时,span 就会开始,当这一系列任务结束后,span 也随之结束。 由此可见,tracing 其实不仅仅是一个日志库,它还是一个分布式追踪的库,可以帮助我们采集信息,然后上传给 jaeger 等分布式追踪平台,最终实现对指定应用程序的监控。 @@ -373,7 +373,7 @@ where ``` 运行下看看效果: -```properties +```shell $ cargo run --example figure_5 parent span @@ -425,7 +425,7 @@ where } ``` -```properties +```shell $ cargo run --example figure_6 Got on_new_span! level=Level(Info) @@ -545,7 +545,7 @@ fn on_event(&self, event: &tracing::Event<'_>, ctx: tracing_subscriber::layer::C } ``` -```properties +```shell $ cargo run --example figure_9 { From 69e56c8c4093e404cbf8a4314ef75bc701795565 Mon Sep 17 00:00:00 2001 From: Ma Wenqi Date: Thu, 28 Apr 2022 14:43:07 +0800 Subject: [PATCH 02/10] Update overview.md --- src/async-rust/tokio/overview.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/async-rust/tokio/overview.md b/src/async-rust/tokio/overview.md index 311be24c..b4ffdb8f 100644 --- a/src/async-rust/tokio/overview.md +++ b/src/async-rust/tokio/overview.md @@ -1,10 +1,10 @@ # tokio 概览 -对于 Async Rust,最最重要的莫过于底层的异步运行时,它提供了执行器、任务调度、异步 API 等核心服务。简单来说,使用 Rust 提供的 `async/.await` 特性编写的异步代码要运行起来,就必须依赖于异步运行时,否则这些代码将毫无用处。 +对于 Async Rust,最最重要的莫过于底层的异步运行时,它提供了执行器、任务调度、异步 API 等核心服务。简单来说,使用 Rust 提供的 `async/await` 特性编写的异步代码要运行起来,就必须依赖于异步运行时,否则这些代码将毫无用处。 ## 异步运行时 -Rust 语言本身只提供了异步编程所需的基本特性,例如 `async/.await` 关键字,标准库中的 `Future` 特征,官方提供的 `futures` 实用库,这些特性单独使用没有任何用处,因此我们需要一个运行时来将这些特性实现的代码运行起来。 +Rust 语言本身只提供了异步编程所需的基本特性,例如 `async/await` 关键字,标准库中的 `Future` 特征,官方提供的 `futures` 实用库,这些特性单独使用没有任何用处,因此我们需要一个运行时来将这些特性实现的代码运行起来。 异步运行时是由 Rust 社区提供的,它们的核心是一个 `reactor` 和一个或多个 `executor`(执行器): @@ -31,13 +31,13 @@ Rust 语言本身只提供了异步编程所需的基本特性,例如 `async/. 相信大家看到现在,心中应该有一个结论了。首先,运行时之间的不兼容性,让我们必须提前选择一个运行时,并且在未来坚持用下去,那这个运行时就应该是最优秀、最成熟的那个,`tokio` 几乎成了不二选择,当然 `tokio` 也有自己的问题:更难上手和运行时之间的兼容性。 -如果你只用 `tokio` ,那兼容性自然不是问题,至于难以上手,Rust 这么难,我们都学到现在了,何况区区一个异步运行时,在本书的帮忙下,这些都不再是个问题:) +如果你只用 `tokio` ,那兼容性自然不是问题,至于难以上手,Rust 这么难,我们都学到现在了,何况区区一个异步运行时,在本书的帮助下,这些都不再是问题:) ## tokio 简介 tokio 是一个纸醉金迷之地,只要有钱就可以为所欲为,哦,抱歉,走错片场了。`tokio` 是 Rust 最优秀的异步运行时框架,它提供了写异步网络服务所需的几乎所有功能,不仅仅适用于大型服务器,还适用于小型嵌入式设备,它主要由以下组件构成: -- 多线程版本的异步运行时,可以运行使用 `async/.await` 编写的代码 +- 多线程版本的异步运行时,可以运行使用 `async/await` 编写的代码 - 标准库中阻塞 API 的异步版本,例如`thread::sleep`会阻塞当前线程,`tokio`中就提供了相应的异步实现版本 - 构建异步编程所需的生态,甚至还提供了 [`tracing`](https://github.com/tokio-rs/tracing) 用于日志和分布式追踪, 提供 [`console`](https://github.com/tokio-rs/console) 用于 Debug 异步编程 From 59e1bec77a9cdd0953a38e29f598cc01cc99adfe Mon Sep 17 00:00:00 2001 From: p9s Date: Thu, 28 Apr 2022 19:57:05 +0800 Subject: [PATCH 03/10] Update struct.md --- src/basic/compound-type/struct.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/basic/compound-type/struct.md b/src/basic/compound-type/struct.md index 76271cce..43e59dfe 100644 --- a/src/basic/compound-type/struct.md +++ b/src/basic/compound-type/struct.md @@ -10,13 +10,13 @@ #### 定义结构体 -一个结构体有几部分组成: +一个结构体由几部分组成: - 通过关键字 `struct` 定义 - 一个清晰明确的结构体 `名称` - 几个有名字的结构体 `字段` -例如以下结构体定义了某网站的用户: +例如, 以下结构体定义了某网站的用户: ```rust struct User { From e6d605fc977ee8616a2d1909bf3af13eabc5b0a7 Mon Sep 17 00:00:00 2001 From: Yu Jian Date: Fri, 29 Apr 2022 01:17:35 +0800 Subject: [PATCH 04/10] fix misleading expression in deref.md Declaring Target is required by Deref trait, not just for readability. For T with Deref, deref coercion occurs when the argument is a reference to T, not a value of T. --- src/advance/smart-pointer/deref.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/advance/smart-pointer/deref.md b/src/advance/smart-pointer/deref.md index 7e93f483..105fca33 100644 --- a/src/advance/smart-pointer/deref.md +++ b/src/advance/smart-pointer/deref.md @@ -126,7 +126,7 @@ impl Deref for MyBox { 很简单,当解引用 `MyBox` 智能指针时,返回元组结构体中的元素 `&self.0`,有几点要注意的: -- 为了可读性,我们声明了关联类型 `Target` +- 按照 `Deref` 类型的要求,我们声明了关联类型 `Target` - `deref` 返回的是一个常规引用,可以被 `*` 进行解引用 之前报错的代码此时已能顺利编译通过。当然,标准库实现的智能指针要考虑很多边边角角情况,肯定比我们的实现要复杂。 @@ -147,7 +147,7 @@ impl Deref for MyBox { ## 函数和方法中的隐式 Deref 转换 -在函数和方法中,Rust 提供了一个极其有用的隐式转换:`Deref `转换。简单来说,当一个实现了 `Deref` 特征的值被传给函数或方法时,会根据函数参数的要求,来决定使用该值原本的类型还是 `Deref` 后的类型,例如: +对于函数和方法的传参,Rust 提供了一个极其有用的隐式转换:`Deref `转换。在接受参数时,如果传入的参数是一个实现了 `Deref` 的类型的引用,而形参类型和它不一样,会尝试将其转化为 `Deref` 特征的 `Target` 类型的引用,例如: ```rust fn main() { @@ -162,8 +162,8 @@ fn display(s: &str) { 以上代码有几点值得注意: -- `String` 实现了 `Deref` 特征,能被转换成一个 `&str` -- `s` 是一个 `String` 类型,当它被传给 `display` 函数时,自动通过 `Deref` 转换成了 `&str` +- `String` 实现了 `Deref` 特征,它的 `Target` 类型是 `str` +- `&s` 是一个 `&String` 类型,当它被传给 `display` 函数时,自动通过 `Deref` 转换成了 `&str` - 必须使用 `&s` 的方式来触发 `Deref`(仅引用类型的实参才会触发自动解引用) #### 连续的隐式 Deref 转换 From 3ba208dca824d06b6d7c4c0f28ca3e17a48daa32 Mon Sep 17 00:00:00 2001 From: Sunface Date: Fri, 29 Apr 2022 08:53:17 +0800 Subject: [PATCH 05/10] Update src/advance/smart-pointer/deref.md --- src/advance/smart-pointer/deref.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance/smart-pointer/deref.md b/src/advance/smart-pointer/deref.md index 105fca33..e5f73c5d 100644 --- a/src/advance/smart-pointer/deref.md +++ b/src/advance/smart-pointer/deref.md @@ -162,7 +162,7 @@ fn display(s: &str) { 以上代码有几点值得注意: -- `String` 实现了 `Deref` 特征,它的 `Target` 类型是 `str` +- `String` 实现了 `Deref` 特征,可以在需要时自动被转换为 `&str` 类型 - `&s` 是一个 `&String` 类型,当它被传给 `display` 函数时,自动通过 `Deref` 转换成了 `&str` - 必须使用 `&s` 的方式来触发 `Deref`(仅引用类型的实参才会触发自动解引用) From 21a86a08743360b130dd269d74fc0e8d425967a1 Mon Sep 17 00:00:00 2001 From: Sunface Date: Fri, 29 Apr 2022 08:58:33 +0800 Subject: [PATCH 06/10] Update src/advance/smart-pointer/deref.md --- src/advance/smart-pointer/deref.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance/smart-pointer/deref.md b/src/advance/smart-pointer/deref.md index e5f73c5d..c951c053 100644 --- a/src/advance/smart-pointer/deref.md +++ b/src/advance/smart-pointer/deref.md @@ -147,7 +147,7 @@ impl Deref for MyBox { ## 函数和方法中的隐式 Deref 转换 -对于函数和方法的传参,Rust 提供了一个极其有用的隐式转换:`Deref `转换。在接受参数时,如果传入的参数是一个实现了 `Deref` 的类型的引用,而形参类型和它不一样,会尝试将其转化为 `Deref` 特征的 `Target` 类型的引用,例如: +对于函数和方法的传参,Rust 提供了一个极其有用的隐式转换:`Deref `转换。若一个类型实现了 `Deref` 特征,那它的引用在传给函数或方法时,会根据参数签名来决定是否进行隐式的 `Deref` 转换,例如: ```rust fn main() { From 4e595a0b2f852d3ab92354b60ff9632dae8b28a1 Mon Sep 17 00:00:00 2001 From: Sunface Date: Fri, 29 Apr 2022 09:00:07 +0800 Subject: [PATCH 07/10] Update src/advance/smart-pointer/deref.md --- src/advance/smart-pointer/deref.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance/smart-pointer/deref.md b/src/advance/smart-pointer/deref.md index c951c053..18cbb498 100644 --- a/src/advance/smart-pointer/deref.md +++ b/src/advance/smart-pointer/deref.md @@ -126,7 +126,7 @@ impl Deref for MyBox { 很简单,当解引用 `MyBox` 智能指针时,返回元组结构体中的元素 `&self.0`,有几点要注意的: -- 按照 `Deref` 类型的要求,我们声明了关联类型 `Target` +- 在 `Deref` 特征中声明了关联类型 `Target`,在之前章节中介绍过,关联类型主要是为了提升代码可读性 - `deref` 返回的是一个常规引用,可以被 `*` 进行解引用 之前报错的代码此时已能顺利编译通过。当然,标准库实现的智能指针要考虑很多边边角角情况,肯定比我们的实现要复杂。 From 326960f44f32e32295e724b3037d17d2d046b915 Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Fri, 29 Apr 2022 09:05:48 +0800 Subject: [PATCH 08/10] fix: revert wrong fix --- src/logs/tracing-logger.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/logs/tracing-logger.md b/src/logs/tracing-logger.md index eb878dc0..0de7c326 100644 --- a/src/logs/tracing-logger.md +++ b/src/logs/tracing-logger.md @@ -91,7 +91,7 @@ where 从代码中可以看出,我们打印了事件中包含的事件名、日志等级以及事件发生的代码路径。运行后,可以看到以下输出: -```shell +```properties $ cargo run --example figure_1 Got event! @@ -175,7 +175,7 @@ fn on_event( ``` 这段代码看起来有模有样,来运行下试试: -```shell +```properties $ cargo run --example figure_2 Got event! @@ -267,7 +267,7 @@ fn on_event( ``` 继续运行: -```shell +```properties $ cargo run --example figure_3 { @@ -373,7 +373,7 @@ where ``` 运行下看看效果: -```shell +```properties $ cargo run --example figure_5 parent span @@ -425,7 +425,7 @@ where } ``` -```shell +```properties $ cargo run --example figure_6 Got on_new_span! level=Level(Info) @@ -545,7 +545,7 @@ fn on_event(&self, event: &tracing::Event<'_>, ctx: tracing_subscriber::layer::C } ``` -```shell +```properties $ cargo run --example figure_9 { From adbb8472da99ddfbf45edefc1e709f2cbdf5e65b Mon Sep 17 00:00:00 2001 From: Sunface Date: Fri, 29 Apr 2022 10:40:01 +0800 Subject: [PATCH 09/10] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 05690e44..fe945e6d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@
-[![studyrut](https://img.shields.io/badge/RustCn-orange)](https://github.com/rustlang-cn) [![Stars Count](https://img.shields.io/github/stars/sunface/rust-course?style=flat)](https://github.com/sunface/rust-course/stargazers) +[![studyrut](https://img.shields.io/badge/RustCn社区-orange)](https://github.com/rustlang-cn) [![Stars Count](https://img.shields.io/github/stars/sunface/rust-course?style=flat)](https://github.com/sunface/rust-course/stargazers) [![](https://img.shields.io/github/issues-pr-closed-raw/sunface/rust-course.svg?style=flat)](https://github.com/sunface/rust-course/issues) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/ines/spacy-course/master) From bc27850ae50ecb576d30a05404c6e47df8fa93a6 Mon Sep 17 00:00:00 2001 From: sunface Date: Fri, 29 Apr 2022 13:39:04 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=91=A8=E5=88=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SUMMARY.md | 2 +- src/rust-weekly.md | 94 ++++++++++++++++++++++------------------------ 2 files changed, 46 insertions(+), 50 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index cf29d8b8..35bbad7c 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -7,7 +7,7 @@ --- [Rust 语言中文网](community.md) [一本生锈的书](rusty-book.md) -[Rust 语言周刊第 9 期](rust-weekly.md) +[Rust 语言周刊第 10 期](rust-weekly.md) [Rust 翻译计划( 代号 Rustt )](rustt.md) # 快速开始 diff --git a/src/rust-weekly.md b/src/rust-weekly.md index 41599b7b..7903d400 100644 --- a/src/rust-weekly.md +++ b/src/rust-weekly.md @@ -1,85 +1,81 @@ -# 「Rust 语言周刊」 第 9 期 · 2022-04-24 +# 「Rust 语言周刊」 第 10 期 · 2022-04-29 Rust语言周刊精选全世界过去一周的优秀文章、新闻、开源项目和语言动态。 -本周刊由 RustCn 倾情打造,其中, `[Zh]` 标识的中文资料由 Rust 翻译计划提供,并且原始的 Markdown 文档已[全部开源](https://github.com/rustlang-cn/rustt),欢迎大家阅读和订阅。 +本周刊由 RustCn 社区倾情打造,其中, `[Zh]` 标识的中文资料由 Rust 翻译计划提供,并且原始的 Markdown 文档已[全部开源](https://github.com/rustlang-cn/rustt),欢迎大家阅读和订阅。 > RustCn:https://hirust.cn, 公众号: Rust语言中文网 - -
题图: MnemOS
+ +
题图: Robyn
+#### Rust新闻 -#### 开源项目 - -1、[一个新的小型操作系统: MnemOS](https://jamesmunns.com/blog/mnemos-initial-release/) - -该操作系统使用 Rust 开发,适用于受限的硬件环境,例如微控制器。但是目前它的状态还比较玩具,大家想要用它来 make money ,还是洗洗睡了吧,用来学习下新的领域倒是很不错,毕竟互联网的未来..懂的都懂。 - -2、[著名 Rust 游戏引擎 Bevy 发布 0.7 版本](https://bevyengine.org/news/bevy-0-7/) - -Bevy 的游戏引擎理念可谓是非常先进,因此得到了一大票忠实的粉丝和贡献者的喜爱,发展也极为迅速,这次的新版本带来了大量的新特性,包括骨骼动画、场景中的无限制点光源、集群渲染、材质压缩、着色器优化、ECS优化等等。 - -但。。。离生产可用,依然有很长的距离,大家在业余爱好上玩玩即可,毕竟哪个男孩子没有一个游戏梦呢 :P - - +1、[Rust 库团队的愿景](https://blog.rust-lang.org/inside-rust/2022/04/20/libs-aspirations.html) -3、[systeroid: Rust 版本的 sysctl](https://systeroid.cli.rs) +最近,Rust 语言发布了 [2024 年展望](https://zhuanlan.zhihu.com/p/490221490),编译器团队也发布了 [2022年 野望](https://blog.rust-lang.org/inside-rust/2022/02/22/compiler-team-ambitions-2022.html),现在库团队也不甘落后,为我们带了了未来的库规划和生态发展愿景。 -`sysctl` 大家应该都很熟悉了,但是再辉煌的英雄也终将老去,而我们的 Rust 替代者 `systeroid` 更快、更强、更安全,值得一试! - - +#### 开源项目 +1、[Robyn: 一个全新的 Python Web 框架](https://www.sanskar.me/hello_robyn.html) -#### 精选文章 +大家会不会以为自己走错片场了?:D 其实没有,因为这个框架是基于 Rust 运行时实现的,在提供了高性能、高吞吐的同时,又能使用 Python 来愉快地写逻辑代码。 -1、[Zh] [用 Rust 加速你的 Python 代码](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-13%5D%20从python调用rust-使用rust加速你的python代码.md) -Python 的广袤天空只存在一个限制,那就是性能,以往都是通过 C/C++ 来增强,现在我们还能使用 Rust 来实现。 +|Total Time(seconds) | Slowest(seconds) | Fastest(seconds)| Average(seconds) |Requests/sec | +| --- | --- | --- | --- | --- | +| Flask(Gunicorn) | 5.5254 | 0.0784 | 0.0028 | 0.0275 | 1809.8082 +|FastAPI(API) | 4.1314 | 0.0733 | 0.0027 | 0.0206 | 2420.4851 +|Django(Gunicorn) | 13.5070 | 0.3635 | 0.0249 | 0.0674 | 740.3558 +|Robyn(1 process and 1 worker) | 1.8324 | 0.0269 | 0.0024 | 0.0091 | 5457.2339 +|Robyn(5 processes and 5 workers) | 1.5592 | 0.0211 | 0.0017 | 0.0078 | 6413.6480 -2、[Zh] [异步 Rust: 协作与抢占式调度](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-12%5D%20异步%20Rust:协作与抢占式调度.md) +2、[Gitoxide: 一个使用 Rust 实现的 Git 命令](https://github.com/Byron/gitoxide/discussions/398) -多线程往往用来并行执行计算密集型任务,但是时代变了,现在,越来越多的程序是I/O 密集型,此时就需要 `async` 来大展身手了。 +它不仅拥有丰富的仓库信息展示,还能在 1 秒内克隆下来 linux 内核代码,它的作者还是一个生活在西安的外国人,它...名字好难记。 -3、[Zh] [如何用 Rust 实现朴素贝叶斯分类器](https://zhuanlan.zhihu.com/p/501337745) +3、[czkawka: 从计算机中移除无需的文件](https://github.com/qarmin/czkawka) -难度高能预警,实力干货满满! +大家不要问我项目名该怎么读,我也不会。但是这个项目还是挺有用的,可以在你的计算机中找出重复的文件、空目录、相似的图片等等。 -4、[Zh] [Ruby 的新 YJIT 编译器已完成,使用 Rust 重新实现](https://zhuanlan.zhihu.com/p/502298810) -去年 12 月时,Ruby 开始将 YJIT 代码库从 C99 移植到 Rust 上,这周,负责此项目的开发者表示已经完成新编译器的实现,等待合并。 - -难道说,使用 Rust 重写各个语言的基础层和工具已经成为了新的潮流? +#### 精选文章 -5、[危! C/C++ 的嵌入式!](https://apollolabsblog.hashnode.dev/why-you-should-be-worried-about-the-future-of-cc-in-embedded-a-case-for-rust) +1、[Zh] [基于 RocksDB 使用 Rust 构建关系型数据库](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-15%5D%20基于RocksDB使用Rust构建关系型数据库.md) -对于嵌入式环境而言,软件的错误和失败太正常不过了,你问我罪魁祸首是谁?嗯,我不知道 🤪,但是我知道未来的救世主可能会是谁。 +现在很多新的数据库底层都是基于 RocksDB 来实现的,作者的 `rrrdb` 亦是如此,从名称也能看出,这个项目不是一个很正式的关系型数据库,但是不妨碍我们去了解下作者的一些构思和实现。 -6、[连续性和包级别的 Where 语句](https://smallcultfollowing.com/babysteps/blog/2022/04/17/coherence-and-crate-level-where-clauses/) +2、[Zh] [使用 Tokio 处理 CPU 密集型任务](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-20%5D%20使用%20Tokio%20处理%20CPU%20密集型任务.md) -大佬的硬核文章又来了。这次带来的是对 Rust 中[孤儿原则](https://course.rs/basic/trait/trait.html#特征定义与实现的位置孤儿规则)的深入分析,曾经大放异彩的它随着时间的逐步推移,却成了包组合的障碍( 通过组合的方式来使用多个包 )。 +众所周知,tokio 是一个异步 IO 库,众所周知知,异步 IO 特别适合网络编程,并不是很适合 CPU 密集的场景,且看作者如何化腐朽为神奇。 -7、[Hack rustc: 为特征实现异步函数](https://blog.theincredibleholk.org/blog/2022/04/18/how-async-functions-in-traits-could-work-in-rustc/) +3、[假设 Rust 目前还是一门相当不完美的语言,我们该怎么改进它?](https://kerkour.com/what-a-better-rust-would-look-like) -目前 Rust 异步工作组的一个重要工作就是让 `async fn` 能在所有 `fn` 出现的地方使用,当然,最受大家关注的,应该就是在特征中使用异步函数了。本文将从 Rustc 的角度出发,来讲解异步函数该如何在特征中实现。 +最近,又双叒叕出了一门新的编程语言:[Hare](https://harelang.org),语法看上去很像 Rust,作者不禁开始思考,人们为啥去创建一门像是 Rust 的新语言,答案可能就藏在文章的标题中。 -8、[该如何选择合适的整数类型?](https://www.thecodedmessage.com/posts/programming-integers/) +4、[间接所有权、浅借用和自引用数据结构](https://yoyo-code.com/indirect-ownership-and-self-borrow/) -> i8 - i64, u8 - u64,天,我该如何选择? +什么?有读者震惊了,为啥这几个概念我都没有听说过?不要慌,其实就是一篇讲解自引用数据结构的文章,例如下面这个结构体: +```rust +struct ParsedFile { + contents: Vec, + // words中包含的项引用了 `contents` 中的数据 + words: Vec<&'self:contents:indirect [u8]> +} +``` -这个问题在国内外各个论坛屡见不鲜,事实上,要正确的回答它,是想当困难的,而本文就是从实践的角度出发,给出该如何选择的建议。 +5、[Rust 中的特征和依赖注入](https://jmmv.dev/2022/04/rust-traits-and-dependency-injection.html) -9、[使用 MacOS 下的 MetaAPI 来构建一个全新的终端](https://console.dev/interviews/warp-zach-lloyd/) +在现代化编程中,依赖注入不说是 superstar,至少也是一颗 star,它可以大幅简化模块化编程和代码可测试性的难度。本文将从特征出发,来看看在 Rust 中该如何实现 DI(dependency injection)。 -聪明的同学可能已经想到,使用 Rust 开发的、MacOS 下的新终端?这会不会是刚融资了几千万美元的 Warp ? Bingo,你猜对了,本文正式对 Warp 的独家采访 +6、[Rust 中的原生标识符](https://inspektor.cloud/blog/raw-identifier-in-rust/) -10、[为何 Rust 在嵌入式这么受欢迎?](https://tweedegolf.nl/en/blog/70/we-asked-5-people-why-they-like-embedded-rust) +不要被标题误导,这篇文章简而言之,就是教大家如果使用 Rust 的预留关键字作为自己的变量或字段名。 -文章采访了 5 位不同的大佬,通过他们的观点,我们可以看出 Rust 为啥在嵌入式领域越来越火了。 +7、[AsRef 中藏有的魔法](https://swatinem.de/blog/magic-asref/) -11、[编译期的求值: Nim, Zig, Rust and C++](https://castillodel.github.io/compile-time-evaluation/) +一般的开发场景中,不太用得到 AsRef,但是如果你和作者一样,从事词法分析相关的开发(或其它类型的数据场景),就值得深入了解下了。 -编译期求值,对于计算性能优化来说是非常重要的,本文将从多门语言的角度出发,看看编译期求值到底是个什么东东。 +8、[在四周内构建一个无服务架构平台](https://www.shuttle.rs/blog/2022/04/22/dev-log-0) -12、[在 10 分钟之内构建并部署一个短域名服务](https://www.shuttle.rs/blog/2022/03/13/url-shortener) +假如你发现了一个潜在的商机,想要给投资人证明这一点,时间很紧迫,只有四周,你会怎么办? -大佬的世界总是与众不同的,这不,作者发现自己失眠后,出于对睡眠不足的恐惧,决定要挑战下自己... \ No newline at end of file