开发者生态
morning
从铁锈到红宝石
2026-05-27
1 阅读
xlii
2026-05-26 从 Rust 到 Ruby 谁会做这样的事情?!?显然:我。我有自己的项目,用 Rust 编写。请注意,不是很大,也许大约。总共30k行代码。 Rust 很冗长,所以它并不是那么令人印象深刻。我已经把它放在一边有一段时间了,一直在研究本地推理、法学硕士、写作代理,我的注意力被吸引到了 Ruby 上。已经有一段时间了。因此,我必须环顾四周,提醒自己 Ruby 和 Ruby on Rails 现在正在做什么。他们做得很好。有一些打字倡议(Sorbet),并且语言本身一如既往地简洁。然后我有了这个想法……但首先要介绍一下:在我的 Rust 应用程序中,我有一个独立的箱子,它几乎是一个用 Tera 和 Axum 编写的 Web 应用程序。总共 14,943 行 Rust 代码,大约 10 秒的编译时间(也许代码并不大,但它把整个宇宙都拉到了后面),然后是相当繁重的 E2E 测试,涉及设置 Playwright 和(因为几乎不可能模拟)一个独立的数据库命名空间和模拟服务(以及一个非常特殊的内部 API 板条箱,允许 Playwright 在无头模式下与应用程序交互......)。所以我想“嗯,我想知道我是否可以让我的 Local Qwen3.6 进行一次性转换”。但在这样做之前,我先进行了研究。我要求几个实例来分析该项目在复杂性、稳定性、可测试性等方面的增益,虽然(显然)稳定性会下降(Ruby 中没有类型),但这并没有那么糟糕(Sorbet 有 Ruby 类型!)。 ┌────────────────────────────────┬──────────────┬────────┬──────────────┐ │ 区域 │ Rust/Axum/Diesel │ 导轨 │ 导轨 + 冰糕 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ 适合单人开发 │ 60 │ 90 │ 85 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ │ 发展速度 │ 40 │ 90 │ 75 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ │ 安全 │ 95 │ 55 │ 80 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ │ 开发复杂度 │ 70 │ 90 │ 75 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ │ 性能 │ 95 │ 50 │ 50 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ 样板文件 │ 30 │ 85 │ 80 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ │ E2E 测试可测试性 │ 40 │ 75 │ 75 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ │ 单元可测试性 │ 20 │ 90 │ 90 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ │ 集成测试的可测试性 │ 30 │ 85 │ 85 │ ├────────────────────────────────┼──────────────┼────────┼──────────────┤ 总 │ 480 │ 710 │ 695 │ └────────────────────────────────┴──────────────┴────────┴──────────────┘ 所以最后,如果应用程序是 Ruby on Rails 应用程序,我似乎(舔手指并转向风)1.47 倍更好的结果。我的本地法学硕士(为人工智能前的游戏热潮而购买)4090 Ti 1 上运行 - 我是一个拥有无限代币的自由人 2 。所以我想:放手吧!由于这是一个相对较小的项目,转换大约需要 30 分钟。我不知道它是否有效,因为我还没有尝试运行它。但我检查了一件事,并惊恐地盯着它: $ fd 。 -e rs -uu | xargs 猫 | wc -l 14943 $ fd 。 -e rb -uu | xargs 猫 | wc -l 3322 没错,伙计们!行数减少 77%;每行 Ruby 对应 4.49 行 Rust 代码。我浏览了 Ruby 代码,看起来……不错。可能有一些错误(没有兔子),但我必须说,对于我过时的眼睛来说,它看起来干净且符合习惯。我将进一步检查它,并记住一些事情:我可以使用代理添加类型,因此类型安全可能可以得到缓解 Ruby/Rails 几乎包括电池+厨房水槽,这比编译的 deps 的 3GiB 还要多。 VCR 测试将变得更加容易。 use_cassette(“llm_call”) 执行结果 = LlmClient 。匹配(条目,data_list)期望(结果。结果。大小)。 to eq(data_list . size) end vs #[derive(Debug)] pub struct MockProvider { 响应:Arc < RwLock < Vec < Response >>> , call_count: Arc < AtomicUsize > , } impl 默认为 MockProvider { fn default () -> Self { Self { 响应:Arc ::new(RwLock::new( vec! [Response::default()])), call_count: Arc ::new(AtomicUsize::new( 0 )), } } } impl MockProvider { pub fn new (responses: Vec < Response > ) -> Self { Self { returns: Arc ::new(RwLock::new(responses)), call_count: Arc ::new(AtomicUsize::new( 0 )), } } } #[async_trait] impl MockProvider 的提供者{ async fn match ( & self, entry: & Entry , data_list: & [Data]) -> Result < MatchResult > { sel