< 返回版块

Mike Tang 发表于 2025-02-06 16:38

CompressO - 使用Tauri实现的视频压缩工具

此应用使用 Tauri 构建,Tauri 是一个基于 Rust🦀 的跨平台桌面应用开发框架。前端采用 Next.js。压缩功能完全由 FFmpeg 处理,使用平台专属的独立二进制文件。该应用完全离线运行,不会发出或接收任何网络请求。

https://github.com/codeforreal1/compressO

auto_context - 为anyhow errors添加上下文

auto_context 过程宏可以用于标注任何项,包括函数、方法和结构体/特征的实现。

上下文会被添加到每个 try 表达式(每个 ? 的使用)中。不同类型的表达式会生成不同格式的上下文:

  • 方法调用:.method_name(args)
  • 函数调用:some::func(args)
  • 标识符:xyz
  • 表达式调用:(.. some expr ..)

其中 args.. 表示存在参数,否则为空。

https://docs.rs/auto-context/latest/auto_context/

我曾认为 TypeScript 的类型系统很强大,直到我尝试了 Rust

我曾认为 TypeScript 的类型系统很强大,直到我尝试了 Rust。

我的第一门语言是 JavaScript,随后是 TypeScript。TypeScript 捕捉到了许多我在 JS 中遇到的错误,比如因为误写 "false" 而不是 false 而调试了两个小时。TypeScript 能帮我发现这些错误,这让我惊叹于它的类型系统有多“强大”。

然后我尝试了 Rust。我已经用 Rust 编程大约两个月了。

Rust 之于 TypeScript,就像 TypeScript 之于 JavaScript。以前我根本无法想象这种区别。拥有一个真正能与代码共存的类型系统,实在是太美妙了。

在 TypeScript 中,一个值声称自己是某种类型,但你无法确定它真的就是那种类型。它可能经过数百次函数调用,而其中某个地方可能使用了 as 断言。如果这个断言是错误的,那么整个类型就会变得无效。如果一个无效类型存在得足够深,它就像瘟疫一样扩散,而你可能完全不会察觉。

TypeScript 的类型推导相比 Rust 更弱,这意味着很多时候你不得不使用 as 断言。而这很糟糕,因为它增加了错误类型进入并传播到代码中的风险。

过去,当人们嘲笑“哈哈,用 JavaScript 做后端”时,我曾认为 TypeScript 是解决方案。但如果你真的想确保程序正确运行,在使用 TypeScript 时仍然需要格外小心。因为值可以声称自己是某种类型,而实际上并不是。

从某种意义上说,使用 as 断言就像在 Rust 里使用 unsafe。你在向编译器承诺某些不变量成立,而编译器本身无法推导这些不变量的正确性。在 Rust 社区,维护 unsafe 代码需要详细记录这些不变量为何成立。但在 TypeScript 里,as 断言几乎不被同样对待,人们往往随手就用,这就成了一个问题。

对我来说,强大的类型系统是编程语言最重要的特性之一。类型系统能以代码本身无法表达的方式,清晰地描述程序的意图。

我非常感激 Rust 和 Haskell 让我真正理解了类型系统。同时,我也很感谢 TypeScript 编译器的开发者们。尽管 TypeScript 远非完美,但我理解它的局限性——毕竟它最终还是要编译成 JavaScript,它必须如此。TypeScript 仍然是 JavaScript 之上的一个重要保护层。

不过,我真的期待一个不再需要 TypeScript 的未来,期待 Rust 框架(如 Dioxus)能像 Next.js 一样流行。(我可以做梦吧?……)

https://www.reddit.com/r/rust/comments/1ifurb2/i_thought_typescripts_type_system_was_powerful/

--

From 日报小组 Mike

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页