Rust 语言特性设计:move 表达式
作者:Niko Matsakis
这篇文章探讨了 Rust 中的“move 表达式”提案,旨在改善引用计数的易用性。
// 提议:
|| something(&move($expr))
// 等价于:
{
let tmp = $expr;
|| something(&{tmp})
}
核心内容包括:
- move 表达式简介:在闭包中使用
move($expr),将表达式的结果移动到闭包中,类似临时变量的移动。 - 实际应用示例:通过 Cloudflare 示例对比传统代码和使用 move 表达式的代码,展示其简化代码的作用。
- 多克隆场景:在需要多次克隆时,move 表达式可清晰地控制克隆的移动和使用。
- 提案背景:该想法并非原创,之前已在 Rust 社区多次提及,最近由 Zachary Harrold 提出并实现为原型。
- 闭包的连续性:move 表达式使闭包的捕获机制更连续,清晰地暴露底层模型。
- move 的合理性:尽管之前对
move有抱怨,但该提案通过统一闭包概念,使move更贴合 Rust 设计。 - 前缀 vs 后缀:move 表达式应为前缀,因为它影响整个表达式的求值时机。
- 总结:该设计简单且扩展了 Rust 现有设计,是向目标迈进的一步,但尚未完全达到“适用于内核和 GUI 的易用性”目标。
- 阅读:https://smallcultfollowing.com/babysteps/blog/2025/11/21/move-expressions/?utm_source=atom_feed
- 讨论:https://www.reddit.com/r/rust/comments/1p35dxp/move_expressions_baby_steps/
better-collect:更加可组合、声明式的迭代器 traits
“better_collect” 是一个 Rust 语言的库,旨在提供一种可组合、声明式的方式来消费迭代器。
它通过定义 Collector 和 RefCollector 等特质,允许开发者以一种高效且声明式的方式处理数据流,例如在单次遍历中同时计算数组的和与最大值,或从数据流中收集唯一数据并进行拼接等操作。
该库还提供了 BetterCollect 特质,扩展了迭代器的功能,使其能够与 Collector 配合使用。
此外,它支持多种数据类型和场景,包括处理非 Copy 类型的数据,且无需额外分配内存。
示例:
fn socket_stream() -> impl Iterator<Item = String> {
["the", "noble", "and", "the", "singer"]
.into_iter()
.map(String::from)
}
// Task: Collect UNIQUE chunks of data and concatenate them.
// `Iterator::unzip` 迭代器需要复制数据
let (chunks, concatenated_data): (HashSet<_>, String) = socket_stream()
// Sad. We have to clone.
// We can't take a reference, since the referenced data is returned too.
.map(|chunk| (chunk.clone(), chunk))
.unzip();
let unzip_way = (concatenated_data, chunks);
// Another approach is do two passes (collect to `Vec`, then iterate),
// which is still another allocation,
// or `Iterator::fold`, which's procedural.
// `Collector` ⭐ 无需复制
let collector_way = socket_stream()
// No clone - the data flows smoothly.
.better_collect(ConcatString::new().then(HashSet::new()));
assert_eq!(unzip_way, collector_way);
- 仓库:https://github.com/discreaminant2809/better_collect
- 讨论:https://www.reddit.com/r/rust/comments/1oxl6zi/better_collect_fold_declaratively/
supertonic:开源设备端 TTS 模型
TTS(Text-to-Speech,文本到语音)模型是一种将文本转换为自然语音的技术,广泛应用于语音助手、有声读物、无障碍阅读等领域。
Supertonic,这是一个新近开源的 TTS 引擎,它速度极快,易于在各种环境(移动设备、网页浏览器和桌面设备)上部署。它适用于多种语言示例,包括 Rust。
- 仓库:https://github.com/supertone-inc/supertonic/tree/main/rust
- 讨论:https://www.reddit.com/r/rust/comments/1p4ohus/opensource_ondevice_tts_model/
在 Rust 类型系统中解决 N-queen 问题
N-皇后问题是一个经典的回溯算法问题。它的目标是在一个 (N \times N) 的棋盘上放置 (N) 个皇后,使得它们互不攻击。皇后可以攻击同一行、同一列以及同一对角线上的任何棋子。
问题描述
- 输入:一个整数 (N),表示棋盘的大小。
- 输出:所有可能的放置方案,每个方案用一个数组表示,数组的第 (i) 个元素表示第 (i) 行的皇后所在的列。
N-皇后问题复杂度:时间复杂度:O(N!) ,因为每一行都有 N 种选择,且需要递归处理每一行;空间复杂度:O(N) ,用于存储当前的皇后位置。
- 代码:https://gist.github.com/frroossst/6734a750c35f7964a38df10a58f4acd8
- 讨论:https://www.reddit.com/r/rust/comments/1oxvcc4/solving_the_n_queen_problem_in_the_rust_type/
讨论:Rust 哪部分最难理解?
“怎么找到 Rust 工作?”
“Invariance, covariance, 和 contravariance。 每次我都需要查一遍。”
见 https://www.reddit.com/r/rust/comments/1p4yov2/which_parts_of_rust_do_you_find_most_difficult_to/
--
From 日报小组 苦瓜小仔
社区学习交流平台订阅:
评论区
写评论还没有评论