本周 Rust 动态 533
2024-02-07
说明: 本周 Rust 动态 533 由 ChatGPT(gpt-4-1106-preview) 翻译。
你好,欢迎阅读本周的 This Week in Rust! Rust 是一种编程语言,旨在帮助每个人构建可靠且高效的软件。 这是其进展和社区情况的周度总结。 想要在这里提及你的内容吗?可以在 Twitter 上给我们标记 @ThisWeekInRust,或在 mastodon.social 上标记 @ThisWeekinRust,或者发送一个 pull request。 想要参与贡献吗?我们欢迎任何贡献。
This Week in Rust 是在 GitHub 上公开开发的,归档可以在 this-week-in-rust.org 查看。 如果你发现本周的问题有任何错误,请提交 PR。
Rust 社区更新
官方
基金会
项目/工具更新
- 宣布 Tauri v2 Beta 版本发布
- Polars — 我们为什么要重写字符串数据类型
- rust-analyzer 更新日志 #219
- Ratatui 0.26.0 - 一个用于创建终端用户界面的 Rust 库
观察/思考
- 它会阻塞吗?
- 在生产环境中使用嵌入式 Rust ..?
- 让 futures 成为 futures
- 编译 Rust 就是测试
- Rust 网络框架的错误报告不佳
- [视频] 证明性能 - FOSDEM 2024 - Rust 开发者自述
- [视频] Stefan Baumgartner - 尝试、特征和启示
- [视频] Rainer Stropek - Rust 的内存管理
- [视频] Shachar Langbeheim - 异步 & FFI - 并不完全是一段美好的故事
- [视频] Massimiliano Mantione - 面向对象编程,以及 Rust
- [音频] 通过指导和知识传播释放 Rust 的力量,与 Tim McNamara 对话
- [音频] 与 Marcin Kulik 讨论 Asciinema
- 非仿射类型、ManuallyDrop 和 Rust 中的不变生命周期 - 第一部分
- 从 Rust 代码访问云文件的九条规则:从升级生物信息学库 Bed-Reader 中实践中得到的经验
Rust 演练
- AsyncWrite 和四种实现的故事
- 没有不安全代码的垃圾回收
- Rust 宏中的 Fragment 指定符
- 用 Rust 编写 REST API
- [视频] 特征和操作符
- 编写一个简单的 netcat 客户端和服务器
杂项
本周的 Crate
本周的 crate 是 embedded-cli-rs,这是一个便于在嵌入式设备上创建命令行界面(CLI)的库。
感谢 Sviatoslav Kokurin 自荐该库!
参与呼吁:项目和演讲者
CFP - 项目
一直想要为开源项目做贡献,但不知道从哪里开始? 我们每周都会从 Rust 社区中挑选一些任务供您选择并开始着手进行!
其中一些任务可能有导师可用,访问任务页面获取更多信息。
- Fluvio - 为 fluvio 客户端 crate 构建新的 Python 包装
- Fluvio - MQTT 连接器:为自动生成的客户端 ID 添加前缀,以防止连接中断
- Ockam - 在
SqlxDatabase
中实现事件 - Ockam - 改进
ockam project ticket
和ockam project enroll
的输出,支持--output json
- Ockam - 改进 ockam project ticket 的输出,确保信息不是不透明的
- Hyperswitch - [功能]:为本地测试与持续集成(CI)设置代码覆盖率
- Hyperswitch - [功能]:让 get_required_value 使用 ValidationError 的 OptionExt
如果您是 Rust 项目拥有者,正在寻找贡献者,请在这里提交任务。
CFP - 演讲者
您是一位新手或有经验的演讲者,正在寻找一个地方分享一些酷东西吗?这一部分高亮显示了正在计划中的活动,并且正在接受提交,参加他们的活动作为演讲者。
- RustNL 2024 投稿 截止 2024-02-19 | 荷兰, Delft | 活动日期:2024-05-07 至 2024-05-08
- NDC Techtown 投稿截止 2024-04-14 | 挪威, Kongsberg | 活动日期:2024-09-09 至 2024-09-12
如果您是希望扩大活动影响范围的活动组织者,请通过 PR 至 TWiR 提交链接到提交网站。
Rust 项目更新
上周合并了309个拉取请求
- 为x86目标特性添加 avx512fp16 支持
- 目前riscv只支持
split_debuginfo=off
- 在龙芯目标上默认使用中等代码模型(target: default to the medium code model on LoongArch targets)
#![feature(inline_const_pat)]
特性现已完整- 实际上在
-Zpanic-abort-tests
中中止 - 为 hashmap 中的 keys 和 values 添加缺失的
potential_query_instability
- 当
is_val_statically_known
不是支持的类型时避免 ICE (内部编译器错误) - 在将标签/生命周期误解为错误的字符字面量时更加谨慎
- 在
profile_user_dist
测试中检查RUST_BOOTSTRAP_CONFIG
- 正确检查
never_type
特性的启用 - 覆盖率:改善对函数/闭包跨度的处理
- 覆盖率:在覆盖率测试中使用正常的
edition
:头 - 在调用表达式上去重更多的尺寸错误
pattern_analysis
:在类型不兼容时优雅地中止pattern_analysis
:清理手动实现pattern_analysis
:清理上下文- 通过在
default_read_buf
中添加检查修复 BufReader 的不安全性 - 修复在常数求值失败后对受污染类型字段访问导致的内部编译器错误问题
- 高级中间表示(hir):重构拥有者节点的 getter 方法
- 高级中间表示(hir):从
MaybeOwned
中移除泛型类型参数 - 提高未使用泛型参数的诊断能力
- 引入对
async
边界修饰符在Fn*
特性上的支持 - 使匹配 NaN 成为硬错误,并移除
illegal_floating_point_literal_pattern
的其余部分 - 使异步闭包的协程定义 ID 成为闭包定义 ID 的子项
- 杂项诊断清理
- 将UI问题测试移至子目录
- 在middle中将谓词、区域和常量相关内容移到它们自己的模块中
- 永不模式:正确的操作是将
!
降级为_
- 在使用下一代解算器的词汇区域解析中规范化区域义务
- 仅在E0308上建议移除
as_*
和to_
转换方法 - 在派生义务错误的主标签上提供更多上下文
- 如果我们在特征边界位置遇到类型,则建议将类型改为常量参数
- 抑制对未解析的顶层属性的无帮助诊断
- miri:在ABI兼容性检查中规范化
struct
尾部 - miri:将
sched_getaffinity
拦截移出 Linux 的 shim 层,支持 FreeBSD su… - miri:切换到 rustc 的
tracing
crate,而不是使用我们自己的log
crate - 撤销不安全的 libcore 变更
- 修复了一些
Arc
分配器泄露的问题 - 使用
<T, U>
实现数组/切片的相等性对比 - 改进
io::Read::read_buf_exact
错误案例 - 拒绝
io::Repeat
中无限大小的读取操作 thread_local::register_dtor
在 FreeBSD 的修复方案- 在 core 中增加 LocalWaker 和 ContextBuilder 类型,以及在 alloc 中加入 LocalWake trait
- codegen_gcc: 改进文件压制的迭代器
- cargo:不在空跨度上恐慌
- cargo:改进地图/序列错误信息
- cargo:也将
-Zpanic-abort-tests
应用于文档测试 - cargo:默认情况下不打印失败时的 rustdoc 命令行
- cargo:稳定 lockfile v4 版本
- cargo:修复 cargo-add 中的 markdown 换行问题
- cargo:使用 spec id 而不是名称来匹配包
- rustdoc:修复脚注处理
- rustdoc:如果这是全局重导出,正确处理属性合并
- rustdoc:防止从 localStorage 中注入 JS
- rustdoc: 特性实现、类型实现:对实现进行排序以避免依赖序列化顺序
- clippy:
redundant_locals
:考虑按值捕获的闭包 - clippy: 新的 lint 检查:
manual_c_str_literals
- clippy: 添加
lint_groups_priority
lint 检查 - clippy: 新增 lint 检查:
ref_as_ptr
- clippy: 为
wildcard_imports
配置添加忽略某些导入的功能 - clippy: 避免删除带标签的代码块
- clippy: 在
unused_io_amount
中修正了对 Ok(lit),unreachable! 和 unwrap 的误报 - rust-analyzer: "标准化导入" 助手以及用于标准化 use 树的工具
- rust-analyzer: 允许在测试中排除引用搜索结果
- rust-analyzer:支持通过
include!
宏 内部 包含的文件进行 GOTO定义的功能(github.com/rust-lang/r… - rust-analyzer:在缺少参数列表时发出解析器错误(github.com/rust-lang/r…
- rust-analyzer:将
Subtree::token_trees
从Vec
更换为装箱切片(github.com/rust-lang/r…
即将举行的活动
2024年2月7日至2024年3月6日之间的Rusty 活动 🦀
虚拟
- 2024-02-07 | 虚拟(美国印第安纳州印第安纳波利斯)| Indy Rust
- 2024-02-08 | 虚拟(美国北卡罗来纳州夏洛特)| Charlottesville Rust Meetup
- 2024-02-08 | 虚拟(德国纽伦堡)| Rust Nüremberg
- 2024-02-10 | 虚拟(波兰克拉科夫)| Stacja IT Kraków
- 2024-02-10 | 虚拟(波兰弗罗茨瓦夫)| Stacja IT Wrocław
- 2024-02-13 | 虚拟(美国德克萨斯州达拉斯)| Dallas Rust
- 2024-02-15 | 虚拟(德国柏林)| OpenTechSchool Berlin + Rust Berlin
- 2024-02-15 | 虚拟 + 现场(捷克布拉格)| Rust Czech Republic
- 2024-02-19 | 虚拟(澳大利亚墨尔本)| Rust Melbourne
- 2024-02-20 | 虚拟 | Rust 午餐会
- 2024-02-21 | 虚拟(英国加的夫)| Rust 和 C++ 加的夫
- 2024-02-21 | 虚拟(加拿大卑诗省温哥华)| Vancouver Rust
- 2024-02-22 | 虚拟(美国北卡罗来纳州夏洛特)| Charlottesville Rust Meetup
亚洲
- 2024-02-10 | 印度海得拉巴 | 海得拉巴Rust语言社区
欧洲
- 2024-02-07 | 科隆, DE | Rust Cologne
- 2024-02-07 | 伦敦, UK | Rust London User Group
- 2024-02-08 | 伯尔尼, CH | Rust Bern
- 2024-02-08 | 奥斯陆, NO | Rust Oslo
- 2024-02-13 | 特隆赫姆, NO | Rust Trondheim
- 2024-02-15 | 布拉格, CZ - 虚拟 + 现场 | Rust Czech Republic
- 2024-02-21 | 里昂, FR | Rust Lyon
- 2024-02-22 | 奥胡斯, DK | Rust Aarhus
北美
- 2024-02-07 | 美国马萨诸塞州布鲁克莱恩 | 波士顿 Rust 聚会
- 2024-02-08 | 美国犹他州雷希 | 犹他 Rust
- 2024-02-12 | 美国明尼苏达州明尼阿波利斯 | 明尼阿波利斯 Rust 聚会
- 2024-02-13 | 美国纽约 | 纽约 Rust
- 2024-02-13 | 美国华盛顿州西雅图 | 柯普希尔 Rust 编程/黑客/学习
- 2024-02-15 | 美国马萨诸塞州波士顿 | 波士顿 Rust 聚会
- 2024-02-15 | 美国华盛顿州西雅图 | 西雅图 Rust 用户组
- 2024-02-20 | 美国加利福尼亚州旧金山 | 旧金山 Rust 学习小组
- 2024-02-22 | 美国加利福尼亚州芒廷维尤 | 芒廷维尤 Rust 聚会
- 2024-02-28 | 美国德克萨斯州奥斯汀 | Rust ATX
大洋洲
- 2024-02-19 | 澳大利亚维多利亚州墨尔本 + 虚拟 | Rust Melbourne
- 2024-02-27 | 澳大利亚首都领地堪培拉 | Canberra Rust 用户组
- 2024-02-27 | 澳大利亚新南威尔士州悉尼 | Rust Sydney
如果你正在举办一个 Rust 活动,请将其添加到日历中以在这里提及。请记住添加活动的链接。 如果需要权限,请电邮Rust 社区团队。
工作机会
请查看 r/rust 上的最新招聘贴
本周金句
我的观点是,如果不理解 Arc、Mutex、变量/引用的可变性,以及 async 和 await 语法最终是如何编译的,那么你就无法正确流畅地使用 Rust 的异步功能。Rust 强制你去理解事物为什么是这样,以及它们是怎样运作的。它只给你很少的抽象层,以便你去做那些自己完成可能会很乏味的事情。
我有机会参与了两个项目,这两个项目极大地迫使我去理解异步/等待(async/await)是如何工作的。第一个项目是将一个完全同步的库进行转换,这个库只需要一个同步 trait 来和外部服务通信。听起来一切都很好,对吧?但问题来了,当我们尝试将其移植到浏览器时。浏览器是单线程的,根本不能阻塞 JavaScript 运行时!对于 Rust 用户来说,它可能是最奇怪的环境。重写整个库根本不可能,因为它已经在其他平台上投入了生产。
我们做的是使用异步语法来重写网络部分,但我们使用了自己的生成器。思路很简单:当调用生成器时,生成器会产生一个 future,而产生的 future 可以被等待。但是!产生的 future 包含了一个指向生成器的 arc 指针。这意味着我们可以给生成器喂入我们正在等待的值,然后持有生成器引用的调用者可以将结果反馈给函数并恢复它。对于浏览器,我们使用原生浏览器 API 来派生网络通信;对于其他平台,我们就使用常规的阻塞网络调用。对于其他平台来说,外部接口保持不变。
诚实地说,我认为其他任何语言可能都无法做到这一点。或许 C 或 C++ 可以,但它们永远不会有相同的开发速度和开发者体验。
我相信人们已经提到过了,但是 Rust 当前的异步模型是最合理的选择。它确实给开发者带来了痛苦,但另一方面,并没有更好的异步模型适用于嵌入式或 WebAssembly。
– 来自 /u/Top_Outlandishness78 在 /r/rust
感谢 Brian Kung 的建议!
《本周在 Rust》由以下人员编辑:nellshamrell、llogiq、cdmistman、ericseppanen、extrawurst、andrewpollack、U007D、kolharsam、joelmarcey、mariannegoldin、bennyvasquez。
电子邮件列表托管赞助由 The Rust Foundation 提供