这位高级开发者从他的第一个大型 Rust 项目中学到了什么
这篇文章是一位拥有十多年编程经验的高级顾问分享的,关于他在假期间使用 Rust 语言开发一个物联网(IoT)最小可行产品(MVP)的经历。作者之前主要使用 C++ 进行数据分析和可视化,并在过去四年里主要使用 Scala 进行开发。他将 Rust 视为 C++ 和 Scala 之间的一个实用的中间地带,并通过构建小型项目和领导每周的读书会来学习 Rust。
项目目标是构建一些资源消耗很少的服务,能够在 Java运行环境(JRE) 过大而不适用 Scala 或 Java 开发的环境中运行。这些服务应该能在网络上的不同节点上运行,并能够相互发现而无需硬编码的 IP 地址。服务之间应该能够相互发送和接收消息,并且系统中应该有一些模拟数据,可以进行可视化或至少导出到电子表格中进行可视化。
作者和另外两名开发者在五个工作日内完成了项目的基础部分,并在接下来的两周内独立完成了项目的其余部分。他们避免使用大型框架,以保持生成的二进制文件和容器尽可能小。项目的最终成果是四个二进制文件的大小在 3.6MB 到 4.8MB 之间,远小于 JRE 的 50-100MB。容器大小在 13.5MB 到 13.7MB 之间,也比 Scala 项目的容器小得多。
作者在项目中遇到了一些挑战,如跨线程数据共享时频繁使用 Arc<Mutex<...>>
,以及在新线程中移动数据前需要克隆数据。最后,作者总结了他在这个项目中学到的一些经验教训,包括对未来 Rust 社区的期望和对其他 Rust 开发者的建议:
- 不应该在所有的 Err 变体中使用 String。作者建议在开始产生错误时就构建错误枚举,以便库的用户能够在不必解析字符串消息的情况下处理错误;
- 作者期待Rust社区能够解决在移动闭包之前显式克隆的问题,使其更加符合人体工程学;
- 尽可能在公共数据类型上实现 PartialEq,crate 的用户可能会感谢你;
- 不要害怕使用
S: Into<String>
而不是&str,虽然可能性能稍差,但更符合人体工程学; - 启用 clippy 的 unwrap_used 和 expect_used lint,以迫使自己直面错误场景,而不是将它们搁置以后处理
2023 Rust 调查问卷填写即将截止
已经是最后可以填写调查问卷的一周了,欢迎没有填写问卷的小伙伴积极参与,并提出宝贵的建议。
egui 发布 0.25 版本
egui 是一个用 Rust 编写的易于使用的 GUI 库,它可以在 Web 和原生环境中运行,近日发布了 0.25 版本,来看看主要的更新内容:
重大变更:
- 忽略额外的 SHIFT 和 ALT 键匹配修饰符
- 替换
Key::PlusEquals
为Key::Plus
和Key::Equals
- 移除
WidgetTextGalley
、WidgetTextJob
等 - 重命名
TextBuffer::replace
为replace_with
新增了一些功能,在 Keyboard 方面有很多较为实用的更新:
- 添加剪切、复制、粘贴等键盘快捷键
- 添加
Key::from_name
、Key::ALL
- 用小部件后备颜色替换
Color32::PLACEHOLDER
- ...
还包括了一些别的新增功能和 bug 修复,感兴趣的可以参考:
-- From 日报小组 RustPlumber
社区学习交流平台订阅:
评论区
写评论还没有评论