大致的规划

知乎链接:
zhuanlan.zhihu.com/p/518978071

学 Rust 是个很流行的话题,Rust 是这些年,真正把一系列 modern 的特性融合在自己身上的一门语言。抛开流行,确实能在 Rust 里学到很多东西。并且由于 Rust 和 js/ts 的相似性,实际上一个资深的 ts 开发者学习 Rust,可能都会对 Rust 的某一部分特性惊呼,这不就是我想要的功能么。。

实际上已经有非常多 from js to Rust 的教程:

Rust Tutorial: An Introduction to Rust for JavaScript Devs – SitePoint www.sitepoint.com/rust-tutori…

24 days from node.js to Rust vino.dev/blog/node-t…

还有很多。

如果只是 Rust 本身实战性质的书和文章就更多了。我的生产语言是 TypeScript,我的出发点,更多的是一个 TyperScripter 的视角去看 Rust,以及 Rust 如何更好的服务好 TS。

这个系列,我的计划是把和 JS/TS 明显不同的部分,以 topic 的形式,逐个击破。例如,宏,目前是完成了官 的文档的翻译,就目前我对宏的理解,最主要还有各个宏,更细节的实例,以及 syn、quote、proc_macro2 的实例。宏观的文章很多,寻找优秀的进行翻译,以及加上一些个人认为对 JS/TS 开发者有用的注解。但是,细节的文章,好的就不多了。例如 24 days from node.js to Rust。我在学习这个教程的时候,就明显感觉,难度呼呼就上去了,后面一大部分,更像是索引。

另一方面,Rust 并不是一个只能进行系统开发的语言,它其实有非常功效的一面,使用 crates.io 的包快速开发软件,是可行的。

回到这个系列,我目前会优先选择的话题如下,这一部分的特点是,和 js/ts 的差别非常大,这一部分首先重要的是原理,其次是实例:

  • ownership
  • packages、crates、modules
  • lifetimes
  • smart pointers
  • concurrency
  • 个人认为,对于 js/ts 开发者比较简单的话题如下,这一部分,更重要的不是原理,而是实例,这一部分我的计划是找场景,和优秀的库的样例代码:

  • trait
  • 实际上,在 ts 里很容易可以实现类似 trait 的范式。
  • 因为只要写 Rust,不可能不写 trait,这一块通过时间和项目,你总能学会。
  • iterators
  • 主要是语法的区别,不考虑细节的话,使用起来差别不大。
  • 这块的核心关键,应该是多用。有一些库,类似 lodash。
  • 闭包
  • 和 js/ts 有区别,但是在单 cpu 场景下区别有限
  • 异步
  • 在单 cpu 场景下区别有限,每个实现,要去研究那个实现的特性,比如使用 tokio 的代码,一般在 main 里会有个 setup_exit_process_panic_hook。这种只能是去研究那个 crate,以及官方的 trait
  • 工具链
  • 比 js 好用太多,如果你能搞定一个 pnpm 的 monorepo,并且集成 eslint、prettier、等等工具。我相信你肯定能搞定 Rust 的工具链。
  • 可以把 js 的工具链带到 Rust,比如 turborepo 可以通过 package.json 来调用
  • monorepo
  • Rust 的项目大都是 monorepo 的,本身对 monorepo 支持也不错。但是 和 ts 的 monorepo 有比较大的差别。这一点我也还在摸索。但是使用上,规模不大时,区别不大。
  • 个人理解,Rust 和 ts 混合的项目,可以充分利用 Cargo.toml 和 package.json ,进行项目管理
  • 其他基础语法
  • 例如循环,更多是语法的区别。
  • 对有函数式编程经验的 js/ts 开发者比较简单的话题是,这一部分,最主要的是函数式,代码每一个复杂的,问题是,为啥要这么做,而为啥要这么做,是最难写的:

  • pattern matching、iterators、error handling
  • 这一块孤立的学是意义不大的,如果你有函数式编程的经验,你会觉得这一部分很简单
  • error handling 更重要的是你选择的 error handling 的框架,或者你自己设计的 Rust 里的 error handling 的机制
  • error handling、pattern matching 两者几乎是同时使用的
  • 最好对函数能有可能 错,和不可能 错的区分的概念,比如在函数式编程里 task 的概念,就是一个可能失败的函数,这个可能失败的函数,会把失败要留下的信息,放在 error 里,这个 error 要填哪些信息,你需要声明在你的 error handling 的框架里,然后使用就好了。
  • 这部分的难度,个人认为是开发者对函数式编程的理解,和 Rust 没啥关系,实际上如果你在自己的 js/ts 里也有一套错误处理机制,尤其是使用了类似 fp-ts 的库,和 rust 实现没有任何本质区别。
  • 这一部分虽然放在这里,但是在看源码时,实际是特别难的一块,因为稍微的规模的 Rust 软件,错误可能就几百几千个。
  • 建议在 ts 里使用 ts-pattern,可以提前演练下这种思维
  • 范型
  • 范型的难点,从来不是语法。相信在生产大量使用范型的童鞋也许会赞同这一点。
  • Rust 因为有宏,宏和范型结合,有了相当多的可能性,同时带来了更无法用语言描述的复杂度。
  • 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年4月20日
    下一篇 2022年4月20日

    相关推荐