From 70b333862c049ddc2e695cceea38cbe4e7d58e00 Mon Sep 17 00:00:00 2001 From: glatavento Date: Wed, 11 May 2022 09:56:34 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=F0=9F=90=9E=20fix:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E8=A7=A3=E6=9E=90=E7=9A=84=E6=B3=9B=E5=9E=8B?= =?UTF-8?q?=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/advance/concurrency-with-threads/sync1.md | 2 +- src/advance/errors.md | 2 +- src/advance/into-types/sized.md | 2 +- src/advance/smart-pointer/rc-arc.md | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/advance/concurrency-with-threads/sync1.md b/src/advance/concurrency-with-threads/sync1.md index bd028963..6ef2477b 100644 --- a/src/advance/concurrency-with-threads/sync1.md +++ b/src/advance/concurrency-with-threads/sync1.md @@ -149,7 +149,7 @@ error[E0277]: `Rc>` cannot be sent between threads safely 错误中提到了一个关键点:`Rc`无法在线程中传输,因为它没有实现`Send`特征(在下一节将详细介绍),而该特征可以确保数据在线程中安全的传输。 -##### 多线程安全的 Arc +##### 多线程安全的 `Arc` 好在,我们有`Arc`,得益于它的[内部计数器](https://course.rs/advance/smart-pointer/rc-arc.html#多线程无力的rc)是多线程安全的,因此可以在多线程环境中使用: diff --git a/src/advance/errors.md b/src/advance/errors.md index 58233145..e94b1221 100644 --- a/src/advance/errors.md +++ b/src/advance/errors.md @@ -521,7 +521,7 @@ fn render() -> Result { 下面依次来看看相关的解决方式。 -#### Box +#### `Box` 大家还记得我们之前提到的 `std::error::Error` 特征吧,当时有说:自定义类型实现 `Debug + Display` 特征的主要原因就是为了能转换成 `Error` 的特征对象,而特征对象恰恰是在同一个地方使用不同类型的关键: diff --git a/src/advance/into-types/sized.md b/src/advance/into-types/sized.md index 2d993d1c..d0a1195c 100644 --- a/src/advance/into-types/sized.md +++ b/src/advance/into-types/sized.md @@ -102,7 +102,7 @@ fn generic(t: &T) { `?Sized` 特征用于表明类型 `T` 既有可能是固定大小的类型,也可能是动态大小的类型。还有一点要注意的是,函数参数类型从 `T` 变成了 `&T`,因为 `T` 可能是动态大小的,因此需要用一个固定大小的指针(引用)来包裹它。 -## Box +## `Box` 在结束前,再来看看之前遗留的问题:使用 `Box` 可以将一个动态大小的特征变成一个具有固定大小的特征对象,能否故技重施,将 `str` 封装成一个固定大小类型? diff --git a/src/advance/smart-pointer/rc-arc.md b/src/advance/smart-pointer/rc-arc.md index 4e414349..dd2e7657 100644 --- a/src/advance/smart-pointer/rc-arc.md +++ b/src/advance/smart-pointer/rc-arc.md @@ -9,7 +9,7 @@ Rust 所有权机制要求一个值只能有一个所有者,在大多数情况 这种实现机制就是 `Rc` 和 `Arc`,前者适用于单线程,后者适用于多线程。由于二者大部分情况下都相同,因此本章将以 `Rc` 作为讲解主体,对于 `Arc` 的不同之处,另外进行单独讲解。 -## Rc +## `Rc` 引用计数(reference counting),顾名思义,通过记录一个数据被引用的次数来确定该数据是否正在被使用。当引用次数归零时,就代表该数据不再被使用,因此可以被清理释放。 @@ -144,7 +144,7 @@ fn main() { - `Rc` 只能用于同一线程内部,想要用于线程之间的对象共享,你需要使用 `Arc` - `Rc` 是一个智能指针,实现了 `Deref` 特征,因此你无需先解开 `Rc` 指针,再使用里面的 `T`,而是可以直接使用 `T`,例如上例中的 `gadget1.owner.name` -## 多线程无力的 Rc +## 多线程无力的 `Rc` 来看看在多线程场景使用 `Rc` 会如何: From b339fb3710b6a3646ceb2815b4736d297d2c70e0 Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Wed, 11 May 2022 13:35:21 +0800 Subject: [PATCH 2/8] fix: typo in bad-stack/layout.md --- src/too-many-lists/bad-stack/layout.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/too-many-lists/bad-stack/layout.md b/src/too-many-lists/bad-stack/layout.md index 3d92bd02..40a805c1 100644 --- a/src/too-many-lists/bad-stack/layout.md +++ b/src/too-many-lists/bad-stack/layout.md @@ -1,5 +1,5 @@ # 基本数据布局( Layout ) -发现一件尴尬的事情,之前介绍了这么多,但是竟然没有介绍链表是什么...亡羊补牢未为晚也,链表就是一系列存储在堆上的连续数据,大家是否不是发现这个定义跟动态数据 `Vector` 非常相似,那么区别在于什么呢? +发现一件尴尬的事情,之前介绍了这么多,但是竟然没有介绍链表是什么...亡羊补牢未为晚也,链表就是一系列存储在堆上的连续数据,大家是不是发现这个定义跟动态数据 `Vector` 非常相似,那么区别在于什么呢? 区别就在于链表中的每一个元素都指向下一个元素,最终形成 - 顾名思义的链表: `A1 -> A2 -> A3 -> Null`。 而数组中的元素只是连续排列,并不存在前一个元素指向后一个元素的情况,而是每个元素通过下标索引来访问。 From 201929eb93bf5fc7bf6b55f589d09122d2c3d906 Mon Sep 17 00:00:00 2001 From: Augus <34206897+DrAugus@users.noreply.github.com> Date: Wed, 11 May 2022 17:45:32 +0800 Subject: [PATCH 3/8] fix: basic/trait/trait.md add '}' --- src/basic/trait/trait.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/basic/trait/trait.md b/src/basic/trait/trait.md index b83c55ec..4763d1f6 100644 --- a/src/basic/trait/trait.md +++ b/src/basic/trait/trait.md @@ -210,7 +210,7 @@ pub fn notify(item1: &T, item2: &T) {} 除了单个约束条件,我们还可以指定多个约束条件,例如除了让参数实现 `Summary` 特征外,还可以让参数实现 `Display` 特征以控制它的格式化输出: ```rust -pub fn notify(item: &(impl Summary + Display)) { +pub fn notify(item: &(impl Summary + Display)) {} ``` 除了上述的语法糖形式,还能使用特征约束的形式: @@ -226,7 +226,7 @@ pub fn notify(item: &T) {} 当特征约束变得很多时,函数的签名将变得很复杂: ```rust -fn some_function(t: &T, u: &U) -> i32 { +fn some_function(t: &T, u: &U) -> i32 {} ``` 严格来说,上面的例子还是不够复杂,但是我们还是能对其做一些形式上的改进,通过 `where`: @@ -235,7 +235,7 @@ fn some_function(t: &T, u: &U) -> i32 { fn some_function(t: &T, u: &U) -> i32 where T: Display + Clone, U: Clone + Debug -{ +{} ``` #### 使用特征约束有条件地实现方法或特征 @@ -365,7 +365,7 @@ help: consider restricting type parameter `T` // 考虑使用以下的特征来 由于 `PartialOrd` 位于 `prelude` 中所以并不需要通过 `std::cmp` 手动将其引入作用域。所以可以将 `largest` 的签名修改为如下: ```rust -fn largest(list: &[T]) -> T { +fn largest(list: &[T]) -> T {} ``` 但是此时编译,又会出现新的错误: From e97a8190a6a905b535a66bf1e1adc5c876c95bca Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Thu, 12 May 2022 13:42:57 +0800 Subject: [PATCH 4/8] fix: typo in bad-stack/basic-operations.md --- src/too-many-lists/bad-stack/basic-operations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/too-many-lists/bad-stack/basic-operations.md b/src/too-many-lists/bad-stack/basic-operations.md index 104e7607..7ca49c7d 100644 --- a/src/too-many-lists/bad-stack/basic-operations.md +++ b/src/too-many-lists/bad-stack/basic-operations.md @@ -108,7 +108,7 @@ impl List { } ``` -`clone` 用起来简单难,且可解万愁,但是。。。既然是链表,性能那自然是很重要的,特别是要封装成库给其他代码使用时,那性能更是重中之重。 +`clone` 用起来简单,且可解万愁,但是。。。既然是链表,性能那自然是很重要的,特别是要封装成库给其他代码使用时,那性能更是重中之重。 没办法了,我们只能向大名鼎鼎的 Rust 黑客 Indiana Jones求助了: @@ -219,7 +219,7 @@ pub fn pop(&mut self) -> Option { } ``` -当链表为 `Empty` 时,返回一个 `None`,表示我们没有 `pop` 到任何元素;若不为空,则返回第一个元素,并将 `head` 指向下一个节点 `node.next`。但是这段代码又报错了: +当链表为 `Empty` 时,返回一个 `None`,表示我们没有 `pop` 到任何元素;若不为空,则返回第一个元素,并将 `head` 指向下一个节点 `node.next`。但是这段代码又报错了: ```shell error[E0507]: cannot move out of `node.next` which is behind a shared reference --> src/first.rs:37:29 From cdbfdf750fc48813b34cf18a47bf75c4c45adb24 Mon Sep 17 00:00:00 2001 From: _lmmmmmm <931420654@qq.com> Date: Sun, 15 May 2022 00:34:59 +0800 Subject: [PATCH 5/8] fix: typo in result-error/panic.md --- src/basic/result-error/panic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/result-error/panic.md b/src/basic/result-error/panic.md index c1b03793..67a77416 100644 --- a/src/basic/result-error/panic.md +++ b/src/basic/result-error/panic.md @@ -87,7 +87,7 @@ note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose bac 上面的代码就是一次栈展开(也称栈回溯),它包含了函数调用的顺序,当然按照逆序排列:最近调用的函数排在列表的最上方。因为咱们的 `main` 函数基本是最先调用的函数了,所以排在了倒数第二位,还有一个关注点,排在最顶部最后一个调用的函数是 `rust_begin_unwind`,该函数的目的就是进行栈展开,呈现这些列表信息给我们。 -要获取到栈回溯信息,你还需要开启 `debug` 标志,该标志在使用 `cargo run` 或者 `cargo build` 时自动开启(这两个操作默认是 `Debug` 运行方式)。同时,栈展开信息在不同操作系统或者 Rust 版本上也所有不同。 +要获取到栈回溯信息,你还需要开启 `debug` 标志,该标志在使用 `cargo run` 或者 `cargo build` 时自动开启(这两个操作默认是 `Debug` 运行方式)。同时,栈展开信息在不同操作系统或者 Rust 版本上也有所不同。 ## panic 时的两种终止方式 From bf33dd012b19799a6ef82a6fdd60b51b5ca5398c Mon Sep 17 00:00:00 2001 From: sunface Date: Mon, 16 May 2022 10:11:03 +0800 Subject: [PATCH 6/8] add 12th weekly --- src/rust-weekly.md | 128 +++++++++++++++++++++++++++++++-------------- 1 file changed, 88 insertions(+), 40 deletions(-) diff --git a/src/rust-weekly.md b/src/rust-weekly.md index 431baba8..020f3f7f 100644 --- a/src/rust-weekly.md +++ b/src/rust-weekly.md @@ -5,94 +5,141 @@ Rust语言周刊精选全世界过去一周的优秀文章、新闻、开源项 > RustCn:https://hirust.cn, 公众号: Rust语言中文网 -# 「Rust 语言周刊」 第 11 期 · 2022-05-07 +# 「Rust 语言周刊」 第 12 期 · 2022-05-16 +Rust语言周刊精选全世界过去一周的优秀文章、新闻、开源项目和语言动态。 + +本周刊由 RustCn 社区倾情打造,其中, `[Zh]` 标识的中文资料由 Rust 翻译计划提供,并且原始的 Markdown 文档已[全部开源](https://github.com/rustlang-cn/rustt),欢迎大家阅读和订阅。 - -
题图: 可视化 Rust 数据类型的内存布局
+> RustCn:https://hirust.cn, 公众号: Rust语言中文网 -#### 本期明星 + +
题图: Kani - Rust 代码检查工具
-1、[Zh] [可视化 Rust 数据类型的内存布局](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-05-04%5D%20可视化%20Rust%20各数据类型的内存布局.md) +#### 官方新闻 -了解 Rust 中每个数据类型的内存布局有助于锻炼我们的编程直觉,可以提前规避一些编译错误和性能问题。 +1、[cc 正式成为官方库: 将 C/C++ 代码编译成 Rust 代码](https://github.com/rust-lang/cc-rs) -原文是以视频形式呈现,译文是由 Rustt 翻译组的明星译者 trdthg (third thing) 倾情翻译,内容巨多、工作量巨大,如果大家喜欢,在[这里](https://github.com/trdthg)给他点个赞吧 :D +Rust 的生态环境正在快速发展中,但是就目前而言,我们依然需要经常去调用 C/C++ 代码,此时 cc 就成了必不可少的构建工具( 配合 build.rs )。 +在之前的某期中,我们有提到该库的作者已经[无力继续维护](https://github.com/rust-lang/cc-rs/issues/663),原因是各种平台兼容的 PR 搞得他焦头烂额,因此希望找一个接盘侠,如果是普通的库就罢了,偏偏是这么重要的库、维护复杂度这么高的库,因此这件事变得异常棘手。 +好在,在官方的协调和支持下,cc 最终转入了官方组织,并且在多个月后,重写开始合并 PR ! #### 开源项目 -1、[shuttle: 使用 Cargo 部署你的 Rust 应用](https://www.shuttle.rs) -说实话,这个库真的很酷很 rusty,它完成了从源代码到云部署的全过程覆盖,支持通过派生特征的方式去自定义你的部署流程,甚至还提供了短域名服务! +1、[Fornjot 发布 0.6 版本:一个使用 Rust 编写的 CAD 应用](https://www.fornjot.app/blog/fornjot-0.6/) + +这个世界需要一个新的 CAD,嗯,不是我说的,是作者说的,虽然我对此表示怀疑 :D + +总之,这个库是一个基于代码扩展的 CAD 应用,但是大家一定不要被 0.6 这个版本号所忽悠,它还很早期!例如它终于在新版本中支持 Z 轴非垂直方向的建模了: + + + +2、[Kani: 一个全新的 Rust 代码检查工具](https://github.com/model-checking/kani) + +Rust 的编译器这么强大,我们为什么还需要另一个非官方的编译检查工具?岂不是没事找事嘛?其实不然,毕竟,面对 unsafe 代码,传统的编译器依然有些有心无力,即使已经有了 mio。 -哦对了,我特别喜欢 shuttle 的 slogan: +而 kami 可以帮助我们检查代码的内存安全、用户定义的危险断言、panics、算术溢出等非预期行为,而且 kami 可以和我们的测试代码紧密结合,例如下面的一使用示例: -> **Let's make Rust the next language of cloud-native** -> -> We love you Go, but Rust is just better. +```rust +use my_crate::{function_under_test, meets_specification, precondition}; -你们喜欢不?😆 +#[kani::proof] +fn check_my_property() { + // 创建一个非确定性的输入 + let input = kani::any(); -2、[Redox发布0.7.0: 一个完全用 Rust 编写,专注于稳定性和安全性的全新微内核操作系统](https://www.redox-os.org/news/release-0.7.0/) + //根据函数的先决条件来限制它 + kani::assume(precondition(input)); -Redox 不是一个新项目,已开发多年,但仍达不到成熟可用的状态,毕竟操作系统不是一个小工程。 + // 调用需要被验证的函数 + let output = function_under_test(input); -不过这次的新版本改动还是挺大的:对硬件扩展的支持、改进的文件系统、重写的引导程序、微内核的更新,甚至它还改进了rustc 和 reibc(基于 Rust 的 C 库)。 + // 检查它是否满足特性需求 + assert!(meets_specification(input, output)); +} +``` -> 求大佬告知:国内在做操作系统的厂商是否有在跟进这个项目,基于它来做一个国产操作系统,不知道有没有搞头 +3、[RepliByte: 一个开源的数据库同步服务](https://github.com/Qovery/replibyte) -3、[重生之路之 Plotters ](https://github.com/plotters-rs/plotters) +作为开发者而言,在测试环境伪造数据用于测试是一件头疼的事,而且还不能反映出真实世界的复杂性,出于自身的这个痛点,作者创建了 RepliByte。 -Plotters 是一个非常棒的纯 Rust 编写的绘图库( charts ),除了支持位图、向量图等传统方式外,还支持 WebAssembly。 +它支持 Pg、Mysql、MongoDB 的数据备份和还原,还支持敏感数据替换、数据子集、传输过程中的数据压缩和加密等,最重要的:它是 Rust 写的,每次想起公司那个占用大量资源、基于 Java 的数据库同步中间件,我就... -但..这个库之前很长一段时间内都没怎么维护,而且还是个人项目,其它贡献者只能望洋兴叹,作为一门有志于 GUI、前端领域的语言,这个库还是非常重要的。 +```shell +### 列出所有备份 +$ replibyte -c conf.yaml dump list -好在,现在作者宣布了自己已经归来,并重新建立了一个组织用于维护该项目。 +type name size when compressed encrypted +PostgreSQL dump-1647706359405 154MB Yesterday at 03:00 am true true +PostgreSQL dump-1647731334517 152MB 2 days ago at 03:00 am true true +PostgreSQL dump-1647734369306 149MB 3 days ago at 03:00 am true true +``` - +```shell +### 还原最新的备份到本地数据库中 +$ replibyte -c conf.yaml dump restore local -v latest -i postgres -p 5432 + +### 还原最新的备份到远程数据库中 +$ replibyte -c conf.yaml dump restore remote -v latest +``` + + +4、[Stretch: 一个高性能的基于 flexbox 的 UI 布局库](https://github.com/DioxusLabs/stretch) + +严格来说,该库是一个 fork 项目,之前的项目已经很久不再维护了,现在 [Dioxus]() 扛起了大旗,目标是为跨平台的布局提供一个坚定的基石,尤其是移动端,未来还会提供除了 `flexbox` 外更多的布局方式。 + +项目目前处于初期阶段,主要是 Dioxus 和 BevyEngine 在参与,如果大家感兴趣,可以看看里面的 `good first issue`。 + +> 感谢 [Asura](https://github.com/asur4s) 同学提供的[消息源](https://github.com/rustlang-cn/rust-weekly/issues/6) #### 精选文章 -1、[Zh] [Rust类型系统图灵完备的证明](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-05-04%5D%20Rust类型系统图灵完备的证明.md) +1、[Zh] [Rust 与 OpenCV](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-05-08%5D%20Rust%20与%20OpenCV.md) + +Rust非常优秀,但是与 C/C++ 等巨头相比,它在社区生态上还只是一头初生牛犊,因此我们经常需要去使用 C/C++ 编写的库。友情提示:在 Rust 中使用 OpenCV 是可行的,但是首先,你可能需要拥有足够的意志力来克服遇到的各种问题,毕竟,这是一条未知之路。 -一门编程语言要进入科研等严肃领域,必须要经过九九之关的检验,其中图灵完备的证明就是其中一环。本文作者通过实现 Smallfuck 的方式(一门已知的图灵完备语言),证明了 Rust 的类型系统是图灵完备的。 +2、[编程语言是平台,而不是产品](https://kerkour.com/programming-languages-are-platforms) -2、 [Zh] [使用 Rust 和 WebAssembly 在 48 小时内制作游戏](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-27%5D%20使用%20Rust%20和%20WebAssembly%20在%2048%20小时内制作游戏.md) +现代社会,每个大公司都想做一个大而全的产品,这样就可以行成更强的护城河,让竞争对手无路可走,然而这种产品会牺牲稳定性和可靠性。那么问题来了,对于编程语言而言,适合吗? -[Ludum Dare] 是一个 48 小时个人游戏开发挑战赛,作者之前已经使用 Unity 参加过几次了,这次,他决定尝试点不一样的。 +3、[Xilem: 一个 Rust UI 架构](https://raphlinus.github.io/rust/gui/2022/05/07/ui-architecture.html) -3、[Zh] [半小时快速了解 Rust](https://github.com/rustlang-cn/Rustt/blob/main/Articles/%5B2022-04-28%5D%20半小时快速了解%20Rust.md) +对于用户界面领域来说,Rust 语言提供了足够的吸引力,原因很简单,它能够同时交付安全性和性能。但是,如何找到一个好的 UI 架构,成为了相当大的挑战。 -21天?7天?3天?都弱爆了好吗!这里,只要半个小时! +在其它语言适用的架构设计未必能很好的应用在 Rust 上,毕竟 Rust 的一些语言特性,学过的人都懂,一个自引用结构体都能整的人快乐无边 :P 基于此原因,一些人并不看好 Rust 在用户界面的未来,但是作者依然坚定的认为 Rust 就是未来。 -4、[GAT的美好未来](https://jackh726.github.io/rust/2022/05/04/a-shiny-future-with-gats.html) +他之前的尝试( 包括当前的 [Druid](https://github.com/linebender/druid) 架构 !) 都存在或多或少的缺陷,因此在这篇文章中,他提出了一个全新的架构,非常值得一读! -GAT 是 Generic Associated Types (泛型关联类型) 的简写,大家可以在[这里](https://blog.rust-lang.org/2021/08/03/GATs-stabilization-push.html)对其进行深入了解。 +4、[使用 Rust 进行有限状态机的建模](https://www.ramnivas.com/blog/2022/05/09/fsm-model-rust) -GAT 计划是在1年多之前就开始了,本身计划在去年 10 月稳定化的,但是其中遇到了不少问题,导致了计划的延期,然后就是 12 月、2月( 这种感觉好熟悉:P )。 +在文章中,作者介绍了如何运用 Rust 的所有权机制和静态编译的特点实现一个有限状态机( FSM )。 -现在,作者终于可以骄傲的写出这篇文章,来告诉我们 GAT 到底可以用来做什么,质量很高,值得一看! -> 关于 GAT 还有另一篇文章值得一读:[生命周期 GAT 的更好替代品](https://sabrinajewson.org/blog/the-better-alternative-to-lifetime-gats) +5、[算法面试很卷?](https://ada-x64.github.io/over-engineering/) +作者在找工作中,现在的大环境意味着算法成了绕不过去的坎。那到底是用更高级的代码卷起来,还是躺平使用简单的实现,文中给出了他的选择。 -5、[C++ & Rust: 泛型和特性化](https://www.tangramvision.com/blog/c-rust-generics-and-specialization) +6、[挑战:在 wifi 路由器上运行 Rust](https://blog.dend.ro/building-rust-for-routers/) -一周一次、喜闻乐见的 C++ Pk Rust 环节又来了,作者所在的公司原本是做 C++ 的,但是在遇到 Rust 后,变心了,甚至还加入了 Rust 基金会,一起来欣赏下他们的一些看法吧。 +作者有一个 OpenWrt wifi 路由器,某一天无聊至极,盯着这个老朋友发呆ing,结果突发奇想,嘿,也许我可以在这上面运行个 Rust 项目。`hello world` 显然跟路由器八字不合,那就写一个 DNS 客户端吧。 -6、[这些年 Rust 编译器帮你捕获的 Bug 们](https://kerkour.com/bugs-rust-compiler-helps-prevent) +7、[Rust 中的 O(1) 泛型](https://peterkos.me/rust-const-generics/) -在过去几十年内,随着程序员水平的越来越高,我们终于证明了自己 —— 没办法写出 Bug Free 的软件。因此,新编程语言的编译器越来越强大,也越来越复杂,Rust 就是其中的翘楚。 +众所周知,Rust 的泛型是零开销的,原因在于编译器会把泛型展开为一个个具体的类型,以二进制文件膨胀的代价来换取性能,这个做法没有任何问题。但是如果我们想要更加强大的泛型特性呢?文中针对这一点,给出了一些有价值的观点,值得一看! -7、[自引用结构体和其替代品](https://swatinem.de/blog/self-reference-alternatives/) +8、[创业公司是否应该使用 Rust ?](https://www.shuttle.rs/blog/2021/10/08/building-a-startup-with-rust) -文章讲解了该如何更好的理解和使用自引用结构体,以及在一些场景下,该如何使用其它方式来替代自引用结构题。 +可以说,每一个优秀的工程师,内心都有这样的梦想:使用技术创业,然后改变世界。就目前来看,Rust 拥有足够的吸引力,那我们是否可以选择 Rust 来作为初创公司的主要语言呢? +9、[使用 Rust 实现去中心化的集群管理](https://quickwit.io/blog/chitchat/) +大家可能在想,分布式集群?难道不是在前面做一层负载均衡( nginx ),后面的集群就随便搞嘛?其实不是,你说的是无状态的分布式集群,这种集群的状态都存储在 redis、mysql 等数据库中,因此分布式很简单。 +但是对于有状态的集群来说,分布式就变成了一个相当棘手且有挑战的问题,最基本的:如果让集群中的节点感知到其它节点,在本文中,你能获取到一些灵感和解决方案。 @@ -100,6 +147,7 @@ GAT 计划是在1年多之前就开始了,本身计划在去年 10 月稳定 目前所有的周刊都按照 `年/月/日期` 的方式归纳在 [docs](./docs) 目录下,大家可以按需查看。 +- [第 11 期](./docs/2022/5月/07.md) - [第 10 期](./docs/2022/5月/07.md) - [第 9 期](./docs/2022/4月/24.md) - [第 8 期](./docs/2022/4月/15.md) From ccdf3ff97e539b2931b8fa5e0de93310a78ede8f Mon Sep 17 00:00:00 2001 From: litao Date: Mon, 16 May 2022 10:08:52 +0800 Subject: [PATCH 7/8] fix: typo in circle-self-ref/self-referential.md --- src/advance/circle-self-ref/self-referential.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance/circle-self-ref/self-referential.md b/src/advance/circle-self-ref/self-referential.md index 11fedf63..ddc6bde6 100644 --- a/src/advance/circle-self-ref/self-referential.md +++ b/src/advance/circle-self-ref/self-referential.md @@ -41,7 +41,7 @@ fn main(){ ## 使用 Option -最简单的方式就是使用 `Opiton` 分两步来实现: +最简单的方式就是使用 `Option` 分两步来实现: ```rust #[derive(Debug)] From 3778e07c1877c94c68769d07d6cad9490408898a Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Mon, 16 May 2022 13:47:40 +0800 Subject: [PATCH 8/8] fix: typo in bad-stack/final-code.md --- src/too-many-lists/bad-stack/final-code.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/too-many-lists/bad-stack/final-code.md b/src/too-many-lists/bad-stack/final-code.md index 95a1b7ea..1b3ddf52 100644 --- a/src/too-many-lists/bad-stack/final-code.md +++ b/src/too-many-lists/bad-stack/final-code.md @@ -41,7 +41,7 @@ mod test { } ``` -在 `src/first.rs` 中添加以上测试模块,然后使用 `cart test` 运行相关的测试用例: +在 `src/first.rs` 中添加以上测试模块,然后使用 `cargo test` 运行相关的测试用例: ```shell > cargo test @@ -62,7 +62,7 @@ mod test { } ``` -大家可以再次尝试使用 `carto test` 运行测试用例,具体的结果就不再展开,关于结果的解读,请参看文章开头的链接。 +大家可以再次尝试使用 `cargo test` 运行测试用例,具体的结果就不再展开,关于结果的解读,请参看文章开头的链接。 ## Drop 现在还有一个问题,我们是否需要手动来清理释放我们的链表?答案是 No,因为 Rust 为我们提供了 `Drop` 特征,若变量实现了该特征,则在它离开作用域时将自动调用解构函数以实现资源清理释放工作,最妙的是,这一切都发生在编译期,因此没有多余的性能开销。