< 返回版块

苦瓜小仔 发表于 2025-11-24 14:02

Tags:日报

Rust 语言特性设计:move 表达式

作者:Niko Matsakis

这篇文章探讨了 Rust 中的“move 表达式”提案,旨在改善引用计数的易用性。

// 提议:
|| something(&move($expr))

// 等价于:
{ 
    let tmp = $expr;
    || something(&{tmp})
}

核心内容包括:

  1. move 表达式简介:在闭包中使用 move($expr),将表达式的结果移动到闭包中,类似临时变量的移动。
  2. 实际应用示例:通过 Cloudflare 示例对比传统代码和使用 move 表达式的代码,展示其简化代码的作用。
  3. 多克隆场景:在需要多次克隆时,move 表达式可清晰地控制克隆的移动和使用。
  4. 提案背景:该想法并非原创,之前已在 Rust 社区多次提及,最近由 Zachary Harrold 提出并实现为原型。
  5. 闭包的连续性:move 表达式使闭包的捕获机制更连续,清晰地暴露底层模型。
  6. move 的合理性:尽管之前对 move 有抱怨,但该提案通过统一闭包概念,使 move 更贴合 Rust 设计。
  7. 前缀 vs 后缀:move 表达式应为前缀,因为它影响整个表达式的求值时机。
  8. 总结:该设计简单且扩展了 Rust 现有设计,是向目标迈进的一步,但尚未完全达到“适用于内核和 GUI 的易用性”目标。

better-collect:更加可组合、声明式的迭代器 traits

“better_collect” 是一个 Rust 语言的库,旨在提供一种可组合、声明式的方式来消费迭代器。

它通过定义 CollectorRefCollector 等特质,允许开发者以一种高效且声明式的方式处理数据流,例如在单次遍历中同时计算数组的和与最大值,或从数据流中收集唯一数据并进行拼接等操作。

该库还提供了 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);

supertonic:开源设备端 TTS 模型

TTS(Text-to-Speech,文本到语音)模型是一种将文本转换为自然语音的技术,广泛应用于语音助手、有声读物、无障碍阅读等领域。

Supertonic,这是一个新近开源的 TTS 引擎,它速度极快,易于在各种环境(移动设备、网页浏览器和桌面设备)上部署。它适用于多种语言示例,包括 Rust。

在 Rust 类型系统中解决 N-queen 问题

N-皇后问题是一个经典的回溯算法问题。它的目标是在一个 (N \times N) 的棋盘上放置 (N) 个皇后,使得它们互不攻击。皇后可以攻击同一行、同一列以及同一对角线上的任何棋子。

问题描述

  • 输入:一个整数 (N),表示棋盘的大小。
  • 输出:所有可能的放置方案,每个方案用一个数组表示,数组的第 (i) 个元素表示第 (i) 行的皇后所在的列。

N-皇后问题复杂度:时间复杂度:O(N!) ,因为每一行都有 N 种选择,且需要递归处理每一行;空间复杂度:O(N) ,用于存储当前的皇后位置。

讨论:Rust 哪部分最难理解?

“怎么找到 Rust 工作?”

“Invariance, covariance, 和 contravariance。 每次我都需要查一遍。”

https://www.reddit.com/r/rust/comments/1p4yov2/which_parts_of_rust_do_you_find_most_difficult_to/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页