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
社区学习交流平台订阅:
评论区
写评论还没有评论